[英]Remove comments from some generated HTML which can be invalid with nested comments
我想从一些生成的内容中删除 HTML 条评论。 如果我使用正则表达式/<.--(?*?)-->/
(不喜欢?
)那么它适用于大多数情况,例如这个例子:
<!-- <h1> test </h1> --> not remove <!-- <h1> test 2 </h1> -->
它摆脱了<h1>
标签并根据需要保留“不删除”。
但是如果注释是嵌套的,那么它将无法正确处理它,因为它会留下最后一个注释结束标记'-->'
。 解决方法是使用贪心模式,但在这种情况下,它不适用于第一种情况,有多个评论。
嵌套评论的示例(我知道它无效 HTML,但它是生成它的后端):
text <!-- something <!-- <p> test </p> --> need remove -->
我试图找到解决方案,但我不知道如何解决这个问题。 有谁知道如何处理它?
正如您所提到的,这令人沮丧,因为使用不贪婪的规则可以解决一个案例,而使用贪婪的规则可以解决另一个案例,但您无法同时解决这两个案例。 嗯,你很幸运,因为 PHP 的 PCRE 引擎接受递归:-)!
所以这个问题可以用(?R)
的魔力来解决,它的作用有点像“在此处复制并粘贴完整模式”,正如我所理解的那样。
模式将是:/<?--(:?(.?<!--|-->).|(?R))*-->/ /<?--(:?(.?<!--|-->).|(?R))*-->/gs
你可以在这里测试它: https://regex101.com/r/fZK8VP/1
解释:
<!--
匹配字符串“<.--”。
(?: | )*
是一个非捕获组,可以重复多次并有两个选项:
A)第一个选项:
(?!<!--|-->)
是一个否定前瞻,如果它后面跟着“<!--”或“-->”,有两个选项表示不匹配。
.
匹配任何字符。
B) 第二个选项:( (?R)
是整个模式(递归)。
-->
匹配字符串“-->”。
我使用s
模式修饰符作为.
如果您对多行有一些评论,也应该匹配新行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.