繁体   English   中英

从某些生成的 HTML 中删除注释,这些注释可能对嵌套注释无效

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM