如何在Mariadb的regexp_replace中使用正则表达式标志?

时间:2019-12-30 21:54:15

标签: mysql regex mariadb

我有一张带有记录的表。记录的字段content包含一些类似<p><a href=\"/pictures/image.jpg\" class=\"highslide\" onclick=\"return hs.expand(this)\"><img src=\"/pictures/image.jpg\" vspace=\"6\" hspace=\"6\" align=\"left\" alt=\"Alt text\" title=\"Title Text\" width=\"260\"></a> Some text content...

的html

我需要删除<a></a>周围的<img>标签。字符串中可以出现多个<a><img></a>。我还做了一个相应的正则表达式,并了解了REGEXP_REPLACE函数。理想情况下,我希望

之类的东西
UPDATE table_name SET content = REGEXP_REPLACE(content, '/<a\shref=\\?"\/pictures\/.+">(<img.+">)<\/a>/gmU', '\\1') WHERE id=1

锻炼,但不能。我不知道将标记gmU放在哪里。另外,在我在互联网上找到的文章/文档中,我没有看到诸如g(全局)和U(不完整)之类的标志。默认情况下它是全局的还是不协调的?如何使其全部正常工作? 10.3.15-MariaDB。

1 个答案:

答案 0 :(得分:0)

在MariaDB中,您可以使用REGEXP_REPLACE表示法在内嵌正则表达式中将标记传递到(?x),其中x是标记。默认情况下,REGEXP_REPLACE替换字符串中 all 个出现的模式,因此您不需要g标志;您也不需要多行标志m,因为您没有尝试使用行锚的开始/结束。您可以使用U来代替?修饰符,以使+不贪心。

您的正则表达式有几个问题:

  1. MariaDB不需要/包含正则表达式
  2. \s代表文字s,需要为\\s
  3. 要匹配文字\,您需要使用\\\\,而不是\\

此正则表达式应为您提供所需的结果

(?U)<a\\s.*href=\\\\?"/pictures.+(<img.+>)</a>

在查询中

SELECT REGEXP_REPLACE(content, '(?U)<a\\s.*href=\\\\?"/pictures.+(<img.+>)</a>', '\\1')
FROM test

Demo on dbfiddle