Comments HTML iç içe olamaz yana, bir regex teoride, iş yapabilirsiniz. Yine de, çözümleyici bir çeşit kullanarak giriş iyi biçimlendirilmiş olması garanti değil, özellikle eğer, daha iyi bir seçim olacaktır.
İşte bu benim girişimi olduğunu. Yalnızca normal yorumlarınızı maç için, bu işe olur. Bunun için üzgünüm oldukça canavar haline gelmiştir. Ben oldukça kapsamlı şekilde test ettik, iyi yapmak gibi görünüyor, ama ben hiçbir garanti vermez.
<!--(?!\s*(?:\[if [^\]]+]|<!|>))(?:(?!-->).)*-->
Açıklama:
<!-- #01: "<!--"
(?! #02: look-ahead: a position not followed by:
\s* #03: any number of space
(?: #04: non-capturing group, any of:
\[if [^\]]+] #05: "[if ...]"
|<! #06: or "<!"
|> #07: or ">"
) #08: end non-capturing group
) #09: end look-ahead
(?: #10: non-capturing group:
(?!-->) #11: a position not followed by "-->"
. #12: eat the following char, it's part of the comment
)* #13: end non-capturing group, repeat
--> #14: "-->"
Adımlar # 02 ve # 11. önemlidir. # 02 şu karakterleri bir koşullu yorum belirtmek yok olmasını sağlar. Bundan sonra, # 11 ise # 12 ve 13 gerçek eşleştirme nedeni, aşağıdaki karakterler yorumun sonunu işaret olmadığından emin kılar.
"Küresel" ve "dotall" bayrakları ile uygulayın.
Tersini (sadece koşullu yorum eşleştirmek) yapmak için, bu gibi bir şey olurdu:
<!(--)?(?=\[)(?:(?!<!\[endif\]\1>).)*<!\[endif\]\1>
Açıklama:
<! #01: "<!"
(--)? #02: two dashes, optional
(?=\[) #03: a position followed by "["
(?: #04: non-capturing group:
(?! #05: a position not followed by
<!\[endif\]\1> #06: "<![endif]>" or "<![endif]-->" (depends on #02)
) #07: end of look-ahead
. #08: eat the following char, it's part of the comment
)* #09: end of non-capturing group, repeat
<!\[endif\]\1> #10: "<![endif]>" or "<![endif]-->" (depends on #02)
Yine, "küresel" ve "dotall" bayrakları ile geçerlidir.
Adım "#02
" Çünkü "alt düzey-ortaya" sözdizimi, bakınız: "MSDN - About Conditional Comments".
Alanlarda izin verilen veya beklenen yerlerde tamamen emin değil. Uygun olan her yerde ifade "\s*
" ekleyin.