Как с помощью регулярных выражений я могу захватить внешний элемент HTML, если в него вложен элемент того же типа? - PullRequest
0 голосов
/ 11 августа 2010

Я пытаюсь захватить определенные части HTML с помощью регулярных выражений, и я столкнулся с ситуацией, которую я не знаю, как решить.

У меня есть фрагмент HTML, подобный этому:

<span ...> .... <span ...> ... </span> ... </span>

Итак, элемент <span>, в который вложен другой элемент <span>.

Я успешно использовал следующее регулярное выражение (в PHP preg_match() / preg_match_all()) для захвата целых элементов HTML:

@<sometag[^>]+>.*?</sometag>@

Это будет захватывать заданный начальный тег и все, вплоть до закрывающего тега того же типа.

Однако в описанной выше ситуацииэто захватило бы начальный <span> и все до следующего закрытия </span>, с которым я столкнулся, так что я получаю следующее:

<span ...> .... <span ...> ... </span>

, то есть внешний начальный тег,затем все до начального тега внутреннего диапазона, затем все до закрывающего тега внутреннего диапазона, что, конечно, не то, что я хочу.

Что я действительно хотел, так это внешний элемент <span>, полный всего, что внутри него, включая внутреннее вложенное <span>.

Есть ли какой-нибудь практический способ достичь этого?

Примечание: синтаксический анализ HTML с использованием синтаксического анализатора XML, вероятно, не подходит, так как HTML-код, над которым я работаю, является старым и очень сломанным HTML 4, выходящим из MS FrontPage, который может задушить любой анализатор.1033 * Спасибо за любую помощь!

1 Ответ

3 голосов
/ 11 августа 2010

Очевидно, что «правильный» ответ - использовать синтаксический анализатор DOM вместо регулярного выражения, но вы говорите, что ваша разметка слишком разбита для синтаксического анализатора.

Прежде чем прибегнуть к регулярному выражению, проверьте, может ли simpleHTMLDOM иметь смысл из этого. это немного более мягко по отношению к разбитой разметке, чем парсеры на основе PHP DOM.

...