Регулярное выражение для вложенных тегов (самое внутреннее, чтобы было проще)

Я исследовал это совсем немного, но не смог найти рабочий пример, как сопоставить вложенные tags html с атрибутами. Я знаю, что можно сопоставить сбалансированные / вложенные самые внутренние tags без атрибутов (например, регулярное выражение для и будет #

]*>(?:(?> [^<]+ ) |]*>))*?

#x).

Тем не менее, я хотел бы увидеть шаблон регулярного выражения, который найдет пару тегов html с атрибутами.

Пример: в основном это должно совпадать

 
**
**
**
**

и не

 
**
**
**
**

У кого-нибудь есть идеи?

Для целей тестирования мы могли бы использовать: http://www.lumadis.be/regex/test_regex.php


PS. Стивен упомянул решение в своем блоге (на самом деле в комментарии), но он не работает

Matching Innermost HTML Elements

 $regex = '/
]+?\bid\s*=\s*"MyID"[^>]*>(?:((?:[^<]++|]*>))+)|(
]*>(?>(?1)|(?2))*))?/i';

Solutions Collecting From Web of "Регулярное выражение для вложенных тегов (самое внутреннее, чтобы было проще)"

RegEx соответствуют открытым тегам, за исключением тегов XHTML

И действительно, это абсолютно невозможно. HTML имеет нечто уникальное, нечто волшебное, которое невосприимчиво к RegEx.

Я создал короткий скрипт python для решения проблемы управления вложенными тегами. Он работает счастливо с html и с другими, ужасными вложенными синтаксисами тоже, как код wiki. Гибридно, я написал это, чтобы избежать регулярного выражения! Я не мог понять их вообще. 🙁 Я использовал эту функцию для чего угодно, она очень хорошо работает для html и xml. Это тоже очень быстро, так как он использует только базовый поиск строк. Я очень рад узнать, что регулярное выражение не может помочь. 🙂

Я хотел бы поделиться сценарием, если кто-то из вас заинтересован; но подумайте, я не программист, я полагаю, что проблема была решена в течение длительного времени!

Вы можете найти меня на моей странице обсуждения в it.source: http://it.wikisource.org/wiki/Discussioni_utente:Alex_brollo

Сопоставление самых близких совпадающих пар тегов

& , а также их атрибутов и контента:

#

)).)*

#s

Ключевым моментом здесь является то, что (?:(?!STRING).)* Относится к строкам, поскольку [^CHAR]* относится к символам.

Кредит: https://stackoverflow.com/a/6996274


Пример в PHP:

 < ?php $text = <<<'EOD' 
in 1
in 2
in 3
in 4
in 5
EOD; $matches = array(); preg_match_all('#
)).)*
#s', $text, $matches); foreach ($matches[0] as $index => $match) { echo "************" . "\n" . $match . "\n"; }

Выходы:

 ************ 
in 3
************
in 5