我使用此正则表达式来传统上查找和替换HTML注释:
//remove HTML comments
$HTML = preg_replace('/<!--(.|\s)+?-->/','',$HTML);
然而,在一台显然崩溃的服务器上(在我的虚拟机上工作正常,但功率非常高)。
逻辑是,开始评论,任何字符或空格(至少一些= +),?
表示“不要贪婪,先停在第一个 - >你得到”< / p>
有没有更好的方式来写这个,尤其是(.|\s)+?
部分?
答案 0 :(得分:0)
如果没有崩溃日志,就不可能确切地知道你的表达是否是罪魁祸首。尽管如此,由于贪婪,它可能是catastrophic backtracking的结果。
并不是我主张使用正则表达式来解析HTML(你最好使用DOMDocument),但是如果继续使用正则表达式路径,请使用:
$HTML = preg_replace('/<!--([\s\S]+?)-->/','',$HTML);
代替。它将捕获空白和非空白,包括新行,并且由于回溯而不会爆炸。
答案 1 :(得分:0)
答案 2 :(得分:0)
你可以试试这个
/<!\-\-[\w\s\S]+?\-\->/
<!
字面匹配字符<!
\-
字面匹配字符-
\-
字面匹配字符-
[\w\s\S]+?
匹配下面列表中的单个字符\w
匹配任何字词[a-zA-Z0-9_]
\s
匹配任何空格字符[\r\n\t\f ]
\S
匹配任何非空格字符[^\r\n\t\f ]
\-
字面匹配字符-
\-
字面匹配字符-
>
字面匹配字符>