簡體   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