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