【发布时间】:2010-09-19 09:35:08
【问题描述】:
我正在使用此处的 HTML 清理白名单代码:
http://refactormycode.com/codes/333-sanitize-html
我需要添加“字体”标签作为附加标签来匹配,所以我尝试在<img标签检查之后添加这个条件
if (tagname.StartsWith("<font"))
{
// detailed <font> tag checking
// Non-escaped expression (for testing in a Regex editor app)
// ^<font(\s*size="\d{1}")?(\s*color="((#[0-9a-f]{6})|(#[0-9a-f]{3})|red|green|blue|black|white)")?(\s*face="(Arial|Courier New|Garamond|Georgia|Tahoma|Verdana)")?\s*?>$
if (!IsMatch(tagname, @"<font
(\s*size=""\d{1}"")?
(\s*color=""((#[0-9a-f]{6})|(#[0-9a-f]{3})|red|green|blue|black|white)"")?
(\s*face=""(Arial|Courier New|Garamond|Georgia|Tahoma|Verdana)"")?
\s*?>"))
{
html = html.Remove(tag.Index, tag.Length);
}
}
除了上述条件之外,我的代码与我链接到的页面中的代码几乎相同。当我尝试在 C# 中对此进行测试时,它会抛出一个异常“Not enough )'s”。我数过括号数次,并通过一些基于 Javascript 的在线正则表达式测试器运行表达式,但似乎没有一个告诉我任何问题。
我是否在我的正则表达式中遗漏了导致括号转义的内容?我需要做什么来解决这个问题?
更新
经过大量的试验和错误,我记得# 符号是正则表达式中的注释。解决此问题的关键是转义 # 字符。万一其他人遇到同样的问题,我已经包含了我的修复(只是转义 # 符号)
if (tagname.StartsWith("<font"))
{
// detailed <font> tag checking
// Non-escaped expression (for testing in a Regex editor app)
// ^<font(\s*size="\d{1}")?(\s*color="((#[0-9a-f]{6})|(#[0-9a-f]{3})|red|green|blue|black|white)")?(\s*face="(Arial|Courier New|Garamond|Georgia|Tahoma|Verdana)")?\s*?>$
if (!IsMatch(tagname, @"<font
(\s*size=""\d{1}"")?
(\s*color=""((\#[0-9a-f]{6})|(\#[0-9a-f]{3})|red|green|blue|black|white)"")?
(\s*face=""(Arial|Courier\sNew|Garamond|Georgia|Tahoma|Verdana)"")?
\s*?>"))
{
html = html.Remove(tag.Index, tag.Length);
}
}
【问题讨论】:
-
您的更新仅适用于指定了 IgnorePatternWhitespace 选项的情况......这是我在没有回复的情况下询问的 IsMatch 代码......即您没有向我们展示导致问题的代码。
-
顺便说一句:您的正则表达式不会匹配具有不同顺序属性的字体标签,例如
-
属性没有以不同的顺序匹配,我很好。我使用的 HTML 编辑器控件只会按照我测试的顺序生成 标记。