@voodookiidoo

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

Пытаюсь решить задачу, по извлечению парных тегов из html страницы. В голову пришло любопытное решение: вытаскивать все парные теги, запихивая содержимое в группу, после чего проводить рекурсивный поиск по группе. Однако при таком подходе появляется проблема: регулярка либо сжирает чужие теги, либо попросту теряет нужные. Как пример:
pattern = "<span.*?>(.*?)<\/span>"

string = "<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span>"

В таком случае, он выдаст приемлемый результат:
match -> "<span aria-hidden="true" class="line-numbers-rows"><span></span><span></span><span></span></span>"

match.group(1) -> "<span></span><span></span><span></span>"

Однако когда я запускаю такой же поиск по группе, происходит нехорошая вещь:
match -> "<span></span><span></span><span></span>"

match.group(1) -> "</span><span></span><span>"

То бишь регулярка съедает чужой закрывющий тег. Поигравшись с кванторами, получилось извлечь правильно теги из группы, но тогда в первом примере, часть тегов попросту игнорируется.
Вопрос, как быть?
Возмозжно я что то с кванторами не учёл, или есть какой-то особый способ решения такого - буду рад услышать. Заранее благодарю за внимание
  • Вопрос задан
  • 130 просмотров
Решения вопроса 2
DevMan
@DevMan
лучше бы вам в голову пришло не пользоваться для этого регулярками, а нормальными инструментами: DOM и xpath.
Ответ написан
Комментировать
Alexandroppolus
@Alexandroppolus
кодир
На исходной строке твоя регуляра дает неправильный результат - выхватывает
<span aria-hidden="true" class="line-numbers-rows"><span></span>

, а match.group(1) будет при этом равен <span>.
Произвольно вложенные теги ты не обработаешь регексом при всём желании.

Ну и помимо этого есть всякие маленькие приятности с открывающим/закрывающим тегом - он может оказаться внутри комментария, внутри значения атрибута, в CDATA, в теге script, и т.д. Эти мелочи можно закрыть регексом (очень большим регексом). А вот вложенные теги - нет.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы