2014-11-04 2 views
-2

У меня есть регулярное выражение для захвата html-тегов из строки. Он работает очень хорошо, но я нашел случай, что он не работает.Regex не работает для захвата html-тегов

Когда у меня есть тег, за которым следует атрибут «data-xxxx-xxxx», тег игнорируется. Если я переместил один и тот же атрибут в последнюю позицию, он будет работать. Если я удалю слово «-» из слова, оно работает.

В моем регулярном выражении чего-то не хватает, но я не могу найти решение для его исправления.

Вот пример, который работает:

<td>Go? <a href="$VAR" target="_blank" data-link-category="cat" 
      data-link-name="bla">Click</a></td> 

<td>Go? <a datalinkcategory="cat" href="$VAR" target="_blank" 
      data-link-name="bla">Click</a></td> 

пример, который не работает:

<td>Go? <a data-link-category="cat" href="$VAR" target="_blank" 
      data-link-name="bla">Click</a></td> 

И мое регулярное выражение:

Regex htmlRegex = new Regex(
    @"(<!--)|(-->)|(<\s?/?\w+((\s+\w+(\s*=\s*(?:""(.|\s)*?""|'(.|\s)*?'|[^'"">\s]+))?)+\s*|\s*)/?>)"); 

Как я могу изменить регулярное выражение для соответствия меток, содержащих атрибуты типа «data-xxxx-xxxx» в начале инструкции?

Благодарим заранее.

+2

Рассматривали ли вы использование выделенного анализатора html, такого как HtmlAgilityPack? – CodeCaster

+3

[Не разбирайте HTML с регулярным выражением!] (Http://stackoverflow.com/a/1732454/418066) – Biffen

+0

Я знаю об этом, но это приложение устарело, и мне просто нужно исправить это регулярное выражение. У меня нет времени для изменения реализации. – placplacboom

ответ

1

Хотя я согласен, что это не хорошая идея для разбора HTML с регулярным выражением, в этом случае вы можете исправить регулярное выражение, добавив hypen в группе характеров с согласованием части против символов слова в начальной проверке атрибутов:

(<!--)|(-->)|(<\s?\/?\w+((\s+[\w-]+(\s*=\s*(?:"(.|\s)*?"|'(.|\s)*?'|[^'"">\s]+))?)+\s*|\s*)\/?>) 
          ^^^^^ 
    change is here, now matches against word characters or hypens 

Working test here, который соответствует всем тэгам ваших тегов.

Обратите внимание, что он, вероятно, по-прежнему будет соответствовать (или не соответствовать) всем видам вещей, которые он не должен (или должен) быть.

+0

Я знаю, приятель! И я согласен со всеми вами, но это приложение беспорядок. Мы используем это регулярное выражение только для поиска якорей и изображений в html-коде. Мы переместим всю систему на новую архитектуру и исправим эти моменты. На данный момент я не хочу тратить время на то, что будет полностью заменено. Спасибо вам за помощь :) – placplacboom

Смежные вопросы