此问题在此处已有答案:
MariaDB regex working in online regex testers does not work in SELECT WHERE REGEXP(2个答案)
18小时前关门了。
此帖子在17小时前编辑并提交审查。
我目前正在把一个非常旧的typo 3 cms移植到wordpress6.1,为了让存储在数据库中的链接正常工作,我不得不使用正则表达式把它们从专有的非xml格式转换成html格式:
<link fileadmin/user_upload/file47.pdf - download>Linktext</link>
必须用这个正则表达式转换
<link\s(fileadmin\S*?)[>\s].+?>(.+?)<\/link>
到这个链接:
<a href="fileadmin/user_upload/file47.pdf">Linktext</a>
我已经在这里测试了正则表达式https://regex101.com/r/cF5ZVR/1-它工作,我也可以在php 7.4中使用它:
php > $pattern = '~<link\s(fileadmin\S*?)[>\s].+?>(.+?)<\/link>~';
php > $replacement = '<a href="$1">$2</a>';
php > $string = '<link fileadmin/user_upload/file47.pdf - download>Linktext</link>';
php > echo preg_replace($pattern, $replacement, $string);
<a href="fileadmin/user_upload/file47.pdf">Linktext</a>
但是当我尝试在MariaDB 10.3.38中使用sql语句执行此操作时,我没有得到任何结果:
select regexp_replace('<link fileadmin/user_upload/file47.pdf - download>Linktext</link>', '<link\s(fileadmin\S*?)[>\s].+?>(.+?)<\/link>', '<a href="\\1">\\2</a>') as replaced;
+-------------------------------------------------------------------+
| replaced |
+-------------------------------------------------------------------+
| <link fileadmin/user_upload/file47.pdf - download>Linktext</link> |
+-------------------------------------------------------------------+
1 row in set (0,000 sec)
我检查了MariaDB的正则表达式语法:https://mariadb.com/kb/en/pcre/和一切似乎看起来很好。
有人能给予我点提示吗?谢谢!
1条答案
按热度按时间06odsfpq1#
您选择的应该是:
你必须在你的正则表达式中转义
\
符号。你在替换字符串中已经这样做了,但是在正则表达式本身中错过了。从正则表达式上的MariaDB KB:
注意:由于MariaDB在字符串中使用C转义语法(例如,
\n
表示换行符),因此必须将REGEXP字符串中使用的任何\
加倍。