Как написать регулярное выражение для разбора html?

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

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

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


person Community    schedule 27.04.2009    source источник
comment
Остерегайтесь Zalgo   -  person Kelly S. French    schedule 13.01.2012


Ответы (5)


Вам также могут быть полезны эти вопросы:

Можете ли вы привести несколько примеров того, почему сложно анализировать XML и HTML с помощью регулярных выражений?

Можете ли вы привести пример анализа HTML с вашим любимым парсером?

person Chas. Owens    schedule 27.04.2009

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

person Brian Agnew    schedule 27.04.2009

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

person Community    schedule 27.04.2009

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

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

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

/<a[^\n]*href[[^\n]*>/searched keyword/</a>/ для поиска ссылок

(Кстати, можно ли это сделать лучше? - Я не умею регулярное выражение;))

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

person Community    schedule 27.04.2009
comment
Дело не в том, что регулярные выражения не являются лучшим решением — то, что вы пытаетесь сделать регулярным выражением, не является допустимым решением совсем. Вместо этого используйте парсер HTML или XML. - person Peter Boughton; 27.04.2009
comment
Хорошо, так какой из них вы рекомендуете. Я бы предпочел легкий ;) - person ; 27.04.2009

Делайте так, как это делает flex: сопоставьте ‹div› с нечувствительным к регистру соответствием и поместите свой парсер в состояние «сопоставление div», продолжайте обрабатывать ввод до ‹/div› и сбросьте состояние.

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

Допустимые символы тегов SGML: [A-Za-z_:]

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

person piotr    schedule 27.04.2009
comment
Или вместо того, чтобы заново изобретать велосипед, используйте существующий уже написанный синтаксический анализатор, который уже будет иметь дело с крайними случаями и так далее. - person Peter Boughton; 27.04.2009