Регулярное выражение для вложенных тегов (внутреннее для облегчения)
Я немного исследовал это, но не смог найти работающего примера, как сопоставить вложенные теги html с атрибутами. Я знаю, что можно сопоставить сбалансированные / вложенные внутренние теги без атрибутов (например, регулярное выражение для и будет #<div\b[^>]*>(?:(?> [^<]+ ) |<(?!div\b[^>]*>))*?</div>
#Икс).
Однако я хотел бы видеть шаблон регулярных выражений, который находит пару тегов html с атрибутами.
Пример: это должно совпадать
<div class="aaa"> **<div class="aaa">** <div> <div> </div> **</div>** </div>
и не
<div class="aaa"> **<div class="aaa">** <div> <div> **</div>** </div> </div>
У кого-нибудь есть идеи?
Для целей тестирования мы могли бы использовать: http://www.lumadis.be/regex/test_regex.php
PS. Стивен упомянул решение в своем блоге (на самом деле в комментарии), но оно не работает
http://blog.stevenlevithan.com/archives/match-innermost-html-element
$regex = '/<div\b[^>]+?\bid\s*=\s*"MyID"[^>]*>(?:((?:[^<]++|<(?!\/?div\b[^>]*>))+)|(<div\b[^>]*>(?>(?1)|(?2))*<\/div>))?<\/div>/i';
3 ответа
Соответствующие самые внутренние совпадающие пары <div>
& </div>
теги, а также их атрибуты и контент:
#<div(?:(?!(<div|</div>)).)*</div>#s
Ключевым моментом здесь является то, что (?:(?!STRING).)*
это строки как [^CHAR]*
это персонажам.
Пример в PHP:
<?php
$text = <<<'EOD'
<div id="1">
in 1
<div id="2">
in 2
<div id="3">
in 3
</div>
</div>
</div>
<div id="4">
in 4
<div id="5">
in 5
</div>
</div>
EOD;
$matches = array();
preg_match_all('#<div(?:(?!(<div|</div>)).)*</div>#s', $text, $matches);
foreach ($matches[0] as $index => $match) {
echo "************" . "\n" . $match . "\n";
}
Выходы:
************
<div id="3">
in 3
</div>
************
<div id="5">
in 5
</div>
RegEx соответствует открытым тегам, кроме автономных тегов XHTML
И действительно, это абсолютно невозможно. В HTML есть что-то уникальное, что-то волшебное, что неуязвимо для RegEx.
Я построил краткий скрипт на python для решения проблемы управления вложенными тегами. Он хорошо работает с HTML и другими ужасными вложенными синтаксисами, такими как вики-код. Hyronically, я написал это, чтобы избежать регулярных выражений! Я не мог их понять вообще.:-(. Я использовал эту функцию для чего угодно, она работает очень хорошо для html и xml. Она также быстрая, так как использует только базовый поиск строк. Я очень рад узнать, что регулярное выражение не может помочь.:-)
Я хотел бы поделиться сценарием, если кто-то из вас заинтересован; но учтите, я не программист, полагаю, что проблема давно решена!
Вы можете найти меня на моей странице обсуждения в it.source: http://it.wikisource.org/wiki/Discussioni_utente:Alex_brollo
Вы можете сделать это рекурсивно, используя то же регулярное выражение, но выполняемое при необходимости. Нравится:
function htmlToPlainText(html) {
let text = html || ''
// as there is html nested inside some html attributes, we need a recursive strategy to clean up the html
while (text !== (text = text.replace(/<[^<>]*>/g, '')));
return text
}
Это работает с такими случаями, как:
<p data-attr="<span>Oh!</span>">Lorem Ipsum</p>
Я нашел этот скрипт здесь: http://blog.stevenlevithan.com/archives/reverse-recursive-pattern