是的,我知道使用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>
答案 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到多,所以涵盖了可选。
我不确定,但我认为贪婪的*不会超过(?:)。