【问题标题】:php regex help, removing a string that starts with [caption id=php 正则表达式帮助,删除以 [caption id= 开头的字符串
【发布时间】:2017-02-27 09:45:20
【问题描述】:

在正则表达式方面需要帮助。我有一大串 HTML,需要删除这样的标签

[caption id="attachment_24612" align="alignnone" width="900"]

每个标签都以相同的[caption id= 开头,以相同的] 结尾……但中间的内容每次都是唯一的。正则表达式代码应该是这样的,但我不知道如何匹配中间

$sourceHTML = preg_replace(array("[caption id=", ""),"", $sourceHTML);

提前感谢您的帮助。

【问题讨论】:

    标签: php regex


    【解决方案1】:

    要删除那些 caption 标签,你可以使用这个正则表达式:

    \[caption[^]]+]
    

    See the demo

    如果您的标签在单行上,并且您想删除前一个正则表达式可以留下的空白行,请考虑使用这个:

    \[caption[^]]+]\R?
    

    \R? 部分将匹配标记后可能出现的换行符。

    See the demo

    示例

    $sourceHTML = preg_replace("/\[caption[^]]+]\R?/", "", $sourceHTML);
    

    【讨论】:

    • 顶部图案非常瘦。品质创造。搜索 one-or-more not closing square bracket (11steps,~0ms) 优于 non-greedy one-or-more dot (62steps,~4ms),因为引擎只需检查一个包含 1 个字符的列表,而不是一个点代表的多个字符。我将来会使用这个优化。 +1 最佳逻辑。
    【解决方案2】:

    改用这个:

    $sourceHTML = preg_replace("/\[caption id=(.*?)\]/", "", $sourceHTML);
    

    【讨论】:

    • 编辑为使用 (.*?) 而不是 (.*) 以避免意外替换
    • 这个答案的正则表达式模式不如 Niitaku 的第一个模式。注意:\sid= 和捕获组() 是不必要的。 Niitaku 的成功模式只使用了 11 个步骤(~0ms),而这个答案使用了 113 个步骤(~29ms)。
    • 不客气,Luke,您可以将答案标记为正确并投票以提供帮助^__^
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-28
    • 1970-01-01
    • 2011-09-16
    相关资源
    最近更新 更多