[英]What's wrong with my regex
是的我知道使用RegEx解析HTML通常是一個壞主意,但除此之外,有人可以解釋這里的錯誤:
string outputString = Regex.Replace(inputString, @"<?(?i:script|embed|object|frameset|frame|iframe|metalink|style|html|img|layer|ilayer|meta|applet)(.|\n)*?>", "");
if (outputString != inputString)
{
Console.WriteLine("unwanted tags detected");
}
它當然會檢測到預期的標簽,如: <script>
和<html>
,但它也拒絕我想要允許的字符串,例如<B>Description</B>
和<A href="http://www.mylink.com/index.html">A Link containing 'HTML'</A>
我認為問題是第一個問號
<?(?i:script
您可能希望匹配結束html標記中的前導“/”字符,對吧? 我認為問號使“<”可選(零或一個匹配)。
我建議使用
<(/)?(?i:script
但我不是RegEx專家......
我不確定你是如何用C#做的,但似乎你忘了讓你的正則表達式不敏感。
從我看來它只需要一點點推動:
改變
"<?(?i:script|...|applet)(.|\n)*?>"
至
"\<(?i:script|...|applet)(.|\n)*?\>"
因為字符<
和>
是特殊的
我會改變
"<?(?i:script|...|meta|applet)(.|\n)*?>"
至
"</?(?:script|...|meta|applet)[^>]*>"
我並不完全熟悉Javascript Regex字符串,但我確實有一個參考資料,我熟悉正則表達式的基礎知識(偶爾我需要復習)。
\\ s完全是可選的 - 不需要它。 如果你願意,你可以保留它。 請注意,這不處理大寫標記。 你將需要處理這些作為額外的情況。
你可能不得不逃避字符串中的/。 你不需要嗎? 之后*因為*表示0到多,所以涵蓋可選。
我不確定,但我認為貪婪的*不會超過(?:)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.