正则表达式查找HTML注释(<! - some string - >)

时间:2015-08-11 16:04:28

标签: php regex html-parsing pcre

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

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

然而,在一台显然崩溃的服务器上(在我的虚拟机上工作正常,但功率非常高)。

逻辑是,开始评论,任何字符或空格(至少一些= +),?表示“不要贪婪,先停在第一个 - >你得到”< / p>

有没有更好的方式来写这个,尤其是(.|\s)+?部分?

3 个答案:

答案 0 :(得分:0)

如果没有崩溃日志,就不可能确切地知道你的表达是否是罪魁祸首。尽管如此,由于贪婪,它可能是catastrophic backtracking的结果。

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

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

代替。它将捕获空白和非空白,包括新行,并且由于回溯而不会爆炸。

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

答案 1 :(得分:0)

如果文件特别大,可能会导致其他计算机崩溃。我写这篇文章的方式如下:

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

如果有的话,可能没有特别好的性能提升。

Regex101

答案 2 :(得分:0)

你可以试试这个

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