簡體   English   中英

如何刪除所有條件HTML注釋?

[英]How to remove all conditional HTML comments?

如何使用正則表達式(lex&yacc)刪除所有HTML條件注釋? 我想刪除所有這些注釋,僅保留最后一個HTML標記。

我已嘗試使用此正則表達式"<!"(.*?)-->來獲取條件注釋,但是它不起作用,我正在尋找與這些條件注釋匹配的正則表達式。

"<!"(.*?)-->

這是下面的HTML代碼:我正在嘗試刪除所有注釋並僅保留最后一個HTML標簽。

<!--[if lte IE 7]> 

    <html class="ie7 oldie" xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"> 

<![endif]-->


<!--[if IE 8]> 

    <html class="ie8 oldie" xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"> 

<![endif]-->


<!--[if gt IE 8]><!--> 
    <html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr"> 
<!--<![endif]-->

這是關於(f)lex正則表達式的兩個重要事實。 (有關Flex模式的完整文檔,請參見flex手冊 。該部分不是很長。)

  1. 在(f)lex中, . 通配符匹配除換行符之外的所有內容。 換句話說,它等效於[^\\n] 因此, "<!".*僅與行尾匹配。 您可以改用(.|\\n)來解決此問題,但請參見下文。

  2. (F)lex不提供非貪婪重復( *? )。 所有重復都延伸到最長的匹配項。 (.*?)-->將與行中的最后一個-->匹配,而(.|\\n)*?-->將與文件中的最后一個-->匹配。

可以編寫一個滿足您需要的正則表達式,盡管有點麻煩:

<!--([^-]|-[^-]|--+[^->])*--+>

只要輸入文本不以未終止的注釋結尾,它就應該起作用。 (您的模式中的引號是不必要的,因為沒有引號的字符對(f)lex沒有任何特殊含義,但是它們不會造成傷害。我將它們省略了,因為我認為它們不會使模式變得更難以理解。)

重復的序列與以下任何一項匹配:

  • 然后其它字符- ; 要么
  • 一個-隨后再超過其他的東西- ; 要么
  • 兩個或多個-后跟>以外的其他內容。

重復中的最后一種選擇可能需要一些解釋。 潛在的問題是避免輸入等問題

<!-- Comment with two many dashes --->

如果我們只是將誘人的--[^>]為第三個選擇,則--->不會被視為終止模式,因為---會匹配--[^>] (破折號不是直角括號)和>然后將匹配[^-] ,並且掃描將繼續。 添加+來匹配更長的破折號是不夠的,因為像許多正則表達式引擎一樣,(f)lex正在尋找最長的整體匹配,而不是每組替代中最長的子匹配。 因此,我們需要編寫--+[^->] ,它不能匹配---

如果不清楚(並且我知道為什么不會這樣),則可以改用開始條件來編寫一套簡單得多的模式:

%x COMMENT
%%
"<!--"    { BEGIN(COMMENT); }
<COMMENT>{
   "-->"   { BEGIN(INITIAL); }
   [^-]+   ;
   .|\n    ;
}

第二個<COMMENT>規則實際上只是一個效率漏洞。 這樣可以避免對每個角色觸發不操作動作。 有了第二條規則,最后一條規則實際上只能匹配一個- ,因此可以這樣寫。 但是完整編寫它可以使您刪除第二條規則,並向自己證明第二條規則不起作用。

像這樣匹配評論的關鍵見解是(f)lex總是選擇最長的匹配,這在某種程度上類似於非貪婪匹配的目標。 <COMMENT>起始條件內時, -僅當不能屬於-->匹配項(更長)時才匹配單字符回退規則。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM