regex 替换TYPO3链接在php中有效,但在mariadb 10.3.38中无效[duplicate]

zfycwa2u  于 2023-03-20  发布在  PHP
关注(0)|答案(1)|浏览(94)

此问题在此处已有答案

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/和一切似乎看起来很好。
有人能给予我点提示吗?谢谢!

06odsfpq

06odsfpq1#

您选择的应该是:

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;

你必须在你的正则表达式中转义\符号。你在替换字符串中已经这样做了,但是在正则表达式本身中错过了。
从正则表达式上的MariaDB KB
注意:由于MariaDB在字符串中使用C转义语法(例如,\n表示换行符),因此必须将REGEXP字符串中使用的任何\加倍。

相关问题