我的正则表达式出了什么问题

时间:2010-03-17 09:48:05

标签: c# 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>

4 个答案:

答案 0 :(得分:2)

我认为问题是

中的第一个问号
<?(?i:script

您可能希望匹配结束html标记中的前导“/”字符,对吧?我认为问号是“&lt;”可选(零或一个匹配)。

我建议使用

<(/)?(?i:script

但我不是RegEx专家......

答案 1 :(得分:1)

我不确定你是如何在C#中这样做的,但似乎你忘了让你的正则表达式不敏感。

答案 2 :(得分:1)

从我看来它只需要一点点推动:

改变
"<?(?i:script|...|applet)(.|\n)*?>"

"\<(?i:script|...|applet)(.|\n)*?\>"

因为字符<>是特殊的

答案 3 :(得分:0)

我会改变

"<?(?i:script|...|meta|applet)(.|\n)*?>"

"</?(?:script|...|meta|applet)[^>]*>"

我对Javascript Regex字符串并不完全熟悉,但我确实有一个参考资料,我熟悉正则表达式的基础知识(偶尔也需要复习)。

\ s完全是可选的 - 不需要它。如果你愿意,你可以保留它。 请注意,这不处理大写标记。你将需要处理这些作为附加案件。

你可能必须转义字符串中的/。你不需要吗?之后*因为*表示0到多,所以涵盖了可选。

我不确定,但我认为贪婪的*不会超过(?:)。

http://www.regular-expressions.info/quickstart.html