使用正则表达式捕获HTML注释,但忽略某些注释

时间:2019-04-04 04:17:05

标签: regex regex-negation regex-lookarounds

除了特定的注释,我想捕获html注释,

 <!-- end-readmore-item --> 

此刻,我可以使用下面的正则表达式成功捕获所有HTML注释,

(?=<!--)([\s\S]*?)-->

要忽略指定的评论,我尝试了先行断后断言,但是在Regex的高级级别上是新手,我可能会错过一些东西。

到目前为止,我已经能够使用环顾四周设计以下正则表达式,

^((?!<!-- end-readmore-item -->).)*$

我希望它忽略end-readmore-item注释,而只捕获其他注释,例如,

<!-- Testing-->

但是,它不仅可以完成工作,而且还捕获了我也希望忽略的常规HTML标签。

我一直在使用以下html代码作为测试用例,

<div class="collapsible-item-body" data-defaulttext="Further text">Further 
text</div>
<!-- end-readmore-item --></div>
</div>
&nbsp;<!-- -->
it only should match with <!-- --> but it's selecting everything except <!-- 
end-readmore-item -->
the usage of this is gonna be to remove all the HTML comments except <!-- 
end-readmore-item -->

2 个答案:

答案 0 :(得分:2)

您可以使用以下模式:

<!--(?!\s*?end-readmore-item\s*-->)[\s\S]*?-->

Regex101 demo

故障:

<!--                    # Matches `<!--` literally.
(?!                     # Start of a negative Lookahead (not followed by).
    \s*                 # Matches zero or more whitespace characters.
    end-readmore-item   # Matches literal string.
    \s*                 # Matches zero or more whitespace characters.
    -->                 # Matches `-->` literally.
)                       # End of the negative Lookahead.
[\s\S]*?                # Matches any character zero or more time (lazy match), 
                        # including whitespace and non-whitespace characters.
-->                     # Matches `-->` literally.

这基本上是指:

  

匹配不是{em> 的<!--,然后是[一个空格 * + end-readmore-item +另一个空格 * + -->],然后是 ,后跟任意数量的字符,然后紧接着是-->


* 一个可选空格重复零次或多次。

答案 1 :(得分:1)

您与否定的超前断言非常接近,只需按如下所示进行修改:

<!--((?!end-readmore-item).)*?-->

*?非贪婪地匹配。

这将匹配所有注释,但注释正文中包含字符串end-readmore-item的注释除外。