REGEXP_REPLACE指南

时间:2019-03-07 09:57:32

标签: mysql regex mariadb

我一直在尝试批量删除Wordpress上帖子中的垃圾链接,如下所示:

<a style="text-decoration: none" href="/price-of-xenical-at-pharmacy">.</a>

它们位于post_content列下的wp_posts表中。我试图通过在href标记中添加%的通配符来完成此操作,因为所有URL都不同,但是锚点(句号)和内联样式相同。

UPDATE wp_posts
SET post_content = REPLACE (post_content,
    '<a style="text-decoration:none" href="%">.</a>',
    '.');

此后,我被告知SQL不支持我正在尝试做的事情(或者至少不支持我做的事情)。

我正在使用显然支持REGEXP_REPLACE的MariaDB,因此我正在寻找有关大规模删除这些链接但保持所有其他内容不变的SQL查询和REGEX的一些指导。

任何帮助表示赞赏,目的是删除上述字符串,或替换为空白

更新

示例帖子内容,最后一个链接是我需要删除的类型。 :

    <h2>Warranty</h2>
<span style="font-size: small"> </span>

<span style="font-size: small">Lorem ipsum dolor sit amet, non risus bibendum quis morbi, duis elit porttitor semper, ante augue at consectetuer elit lectus est, nascetur neque consequuntur donec turpis. Cursus ullamcorper posuere massa interdum, rhoncus blandit, vitae in etiam justo lectus eu fames. Dolor quam dicta wisi class duis. Eleifend sagittis, scelerisque convallis consectetuer sed non aptent. Velit tristique vulputate proin, ipsum diam aliquam. Nibh sit vitae et m</span>

&nbsp;

<a href="https://www.example.com/wp-content/image.jpg"><img class="alignright size-full wp-image-56" title="image" src="https://www.example.com/wp-content/image.jpg" alt="image" width="280" height="280" /></a><a style="text-decoration: none" href="/price-of-xenical-at-pharmacy">.</a>

1 个答案:

答案 0 :(得分:4)

如果要删除所有锚标签,但保留标签中包裹的文本,请尝试使用以下模式:

<a[^>]*>(.*?)</a>

然后,仅替换为第一个捕获组。除了使用(.*?)来捕获锚标记之间的内容外,关于该模式没有太多要说的了。 .*?很重要,它告诉正则表达式引擎在 first 结束标记处停止。否则,如果我们仅使用(.*),则如果它们存在于您的列中,则可能会跨多个锚定标记使用。

SELECT
    REGEXP_REPLACE('<a style="text-decoration:none" href="[^"]*">BLAH</a>',
        '<a[^>]*>(.*?)</a>', '$1');

上面的查询输出BLAH

如果您只是想剥离所有锚标签,请使用以下方法:

SELECT
    REGEXP_REPLACE('<a style="text-decoration:none" href="[^"]*">BLAH</a>',
        '<a[^>]*>(.*?)</a>', '');