[英]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手冊 。該部分不是很長。)
在(f)lex中, .
通配符匹配除換行符之外的所有內容。 換句話說,它等效於[^\\n]
。 因此, "<!".*
僅與行尾匹配。 您可以改用(.|\\n)
來解決此問題,但請參見下文。
(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.