Я использую код белого списка для очистки HTML, найденный здесь:
http://refactormycode.com/codes/333-sanitize-html
Мне нужно было добавить тег «font» в качестве дополнительного тега для соответствия, поэтому я попытался добавить это условие после проверки <img
tag
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, и ни один из них, похоже, не говорит мне о каких-либо проблемах.
Я что-то упускаю в своем регулярном выражении, что приводит к удалению скобок? Что мне нужно сделать, чтобы это исправить?
UPDATE
После долгих проб и ошибок я вспомнил, что знак #
- это комментарий в регулярных выражениях. Ключом к исправлению этой ошибки является экранирование символа #
. На случай, если кто-то еще столкнется с той же проблемой, я включил свое исправление (просто экранирование знака #
)
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);
}
}