【问题标题】:regular expression to find HTML Comment ( <!-- some string --> )用于查找 HTML 注释的正则表达式 ( <!-- some string --> )
【发布时间】:2015-08-11 16:04:27
【问题描述】:

我使用这个正则表达式来查找和替换传统的 HTML 注释:

//remove HTML comments
$HTML = preg_replace('/<!--(.|\s)+?-->/','',$HTML);

但是,在一台明显崩溃的服务器上(在我的 VM 上运行良好,但它的功能非常强大)。

逻辑是,开始评论,任何字符或空格(至少一些 = +),? 的意思是“不要贪心,一开始就停下来-->你得到”

有没有更好的方法来写这个,特别是。 (.|\s)+? 部分?

【问题讨论】:

  • 你能提供$HTML吗?崩溃时是否有错误日志?

标签: php regex html-parsing pcre


【解决方案1】:

如果没有崩溃日志,就无法准确知道您的表情是否是罪魁祸首。假设它是,它可能是 catastrophic backtracking 由于贪婪的结果。

并不是我提倡使用正则表达式来解析 HTML(你最好使用DOMDocument),但如果你继续使用正则表达式路径:

$HTML = preg_replace('/<!--([\s\S]+?)-->/','',$HTML);

相反。它将捕获空白和非空白,包括新行,并且不会由于回溯而崩溃。

示例:https://regex101.com/r/qR1xW1/1

【讨论】:

    【解决方案2】:

    如果文件特别大,可能会导致另一台机器上的崩溃。我写这个的方式如下:

    <!--(.+?)-->
    

    如果有的话,可能没有特别体面的性能改进。

    Regex101

    【讨论】:

    • 不要忘记s修饰符以防注释超过一行。
    • @chris85 好点,不过,我只是做了一个编辑,我认为它可能对性能和处理换行符更好一点:)
    • @chris85 我可能会保留它与. 并建议您提到的 s 修饰符
    【解决方案3】:

    你可以试试这个

    /<!\-\-[\w\s\S]+?\-\->/
    
    • &lt;! 匹配字符 &lt;! 字面意思
    • \- 匹配字符 - 字面意思
    • \- 匹配字符 - 字面意思
    • [\w\s\S]+? 匹配下面列表中的单个字符
    • \w 匹配任意单词字符 [a-zA-Z0-9_]
    • \s 匹配任何空白字符 [\r\n\t\f ]
    • \S 匹配任何非空白字符 [^\r\n\t\f ]
    • \- 匹配字符 - 字面意思
    • \- 匹配字符 - 字面意思
    • &gt; 匹配字符 &gt; 字面意思

    【讨论】:

    • 我想从评论中找到什么策略,“
    猜你喜欢
    • 1970-01-01
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2014-10-15
    • 1970-01-01
    • 2010-11-08
    • 1970-01-01
    • 2012-05-18
    相关资源
    最近更新 更多