Регулярное выражение для вложенных тегов (внутреннее, чтобы было проще) - PullRequest
2 голосов
/ 19 июня 2010

Я немного исследовал это, но не смог найти работающего примера, как сопоставить вложенные HTML-теги с атрибутами.Я знаю, что можно сопоставить сбалансированные / вложенные внутренние теги без атрибутов (например, регулярное выражение для и будет #<div\b[^>]*>(?:(?> [^<]+ ) |<(?!div\b[^>]*>))*?</div> # x).

Однако я хотел бы видеть шаблон регулярного выражения, который находит 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 ]

2 голосов
/ 06 ноября 2011

Я создал короткий скрипт на python для решения проблемы управления вложенными тегами.Он хорошо работает с html и другими ужасными вложенными синтаксисами, такими как вики-код.Hyronically, я написал это, чтобы избежать регулярных выражений!Я не мог их понять вообще.:-(. Я использовал эту функцию для чего угодно, она отлично работает для html и xml. Она также быстрая, поскольку использует только простой поиск по строкам. Я очень рад узнать, что регулярное выражение не может помочь.1001 *

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

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

2 голосов
/ 18 августа 2017

Соответствующие самые внутренние совпадающие пары тегов <div> & </div>, а также их атрибуты и содержимое:

#<div(?:(?!(<div|</div>)).)*</div>#s

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

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


Пример в 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>
2 голосов
/ 19 июня 2010

RegEx соответствует открытым тегам, кроме автономных тегов XHTML

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

...