Вдохновленный этим прекрасным постом :
(?# line 01) <(?<open>.+?)>
(?# line 02) (?>
(?# line 03) <(?<open>.+?)> (?<DEPTH>)
(?# line 04) |
(?# line 05) </\k<open>> (?<-DEPTH>)
(?# line 06) |
(?# line 07) .?
(?# line 08) )*
(?# line 09) (?(DEPTH)(?!))
(?# line 10) </\k<open>>
Это позволит извлечь только правильно совпадающие теги, но не закрытые самостоятельно;он также выполнит базовую проверку вложенности, но не намного:
input:
<code><p>scet</p>
<p>sunny </p>
incorrect
<p>
<p>
<pre>mark
Thomas asd
это должно соответствовать
не должно совпадать
вывод:
<p>scet</p>
<p>sunny </p>
<a>asd</a>
<p><a>this should match</a></p>
Каждая строка вывода соответствует одному совпадению.Однако теги, содержащие атрибуты, конечно же, не будут включены.Регулярное выражение, которое будет правильно обрабатывать больше случаев, было бы по-настоящему ужасно, даже с хорошим форматированием, показанным в блоге, на который я ссылался:)
В этих случаях (особенно если я понимаю, вам нужно )valid XHTML output) Я всегда рекомендовал бы запускать ввод через специализированный синтаксический анализатор, предпочтительно тот, который красиво выводит ошибки синтаксического анализа, и обрабатывал эти ошибки вместо того, чтобы взламывать регулярные выражения.Не знаю хороших (X) HTML-парсеров, хотя, не нужно было делать что-то подобное в течение очень долгого времени.