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

Я немного исследовал это, но не смог найти работающего примера, как сопоставить вложенные теги 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]* это персонажам.

Кредит: /questions/2837062/regulyarnoe-vyirazhenie-dlya-sootvetstviya-tolko-samoj-vnutrennej-posledovatelnosti/2837083#2837083


Пример в 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

Другие вопросы по тегам