Как написать регулярное выражение для разбора HTML? - PullRequest
2 голосов
/ 27 апреля 2009

Я пытаюсь написать регулярное выражение для моего html-парсера.

Я хочу сопоставить тег html с заданным атрибутом (например, <div> с class="tab news selected"), который содержит один или несколько тегов <a href>. Регулярное выражение должно соответствовать всему тегу (от <div> до </div>). Кажется, я всегда получаю ошибки «исчерпана память» - моя программа, вероятно, принимает каждый найденный тег как соответствующий.

Я использую библиотеки регулярных выражений boost.

Ответы [ 5 ]

7 голосов
/ 27 апреля 2009

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

2 голосов
/ 27 апреля 2009

Как уже говорили другие, не используйте регулярные выражения, если это вообще возможно. Если ваш код на самом деле XHTML (т. Е. Это также правильно сформированный XML), я могу порекомендовать парсеры XML * Xerces и Expat , которые будут выполнять работу гораздо лучше, чем регулярные выражения .

1 голос
/ 27 апреля 2009

Может быть, регулярные выражения - не лучшее решение, но я уже использую как пять разных библиотек, и boost отлично справляется с поиском <a href> тегов и ключевых слов.

Я использую эти регулярные выражения:

/<a[^\n]*/searched attribute/[^\n]*>[^\n]*</a>/ для поиска <a href> тегов и:

/<a[^\n]*href[[^\n]*>/searched keyword/</a>/ для размещения ссылок

(КСТАТИ это можно сделать лучше? - я отстой в регулярное выражение;))

Теперь мне нужно найти теги, содержащие <a href>, и я думаю, что регулярные выражения сделают все правильно - возможно, мне нужно написать свою собственную функцию синтаксического анализа, как сказал Петр.

0 голосов
/ 27 апреля 2009

Делайте так, как это делает flex: сопоставьте

с нечувствительным к регистру соответствием и переведите анализатор в состояние "div matched", продолжайте обработку ввода до
и сбросьте состояние.

Для этого требуется два регулярных выражения и переменная состояния.

SGML тегами являются допустимые символы [A-Za-z _:]

Итак: / <[A-Za-z _:] +> / соответствует тегу.

...