preg_match: получить div-ы, которые не содержат div (ов)

#php #regex

#php #регулярное выражение

Вопрос:

Я не могу понять, как получить только те ‘div’-ы (с содержимым), которые не содержат других div (ов).

Например:

 <div id='first'>
    ...
    <div id='second'> 
        ...
    </div> 
</div> 
<div id='third'> 
    ...
</div>
  

И мне нужно только содержимое «второго» и «третьего» разделов, открывающие и закрывающие теги, потому что они не включают другие разделы.

Я попробовал этот шаблон: ~(<div id='[a-z]. ')(.*?)(</div>)~s но это не нормально.

Надеюсь, я понял … заранее благодарю вас!!

Комментарии:

1. еще один синтаксический анализ html с регулярным выражением

Ответ №1:

Хотя я не сторонник использования rexex для извлечения HTML, эта проблема намного проще с xpath и DOM.

 $dom = new DomDocument();
$dom->loadHTML($html);

$xpath = new DOMXPath($dom);
$divs = $xpath->query("//div[not(div)]");
  

Я не тестировал этот код. Но ключевой частью является оператор not, который находит все divs без дочернего узла div.

Комментарии:

1. Спасибо за ваш ответ! Да, это должно быть проще с xpath, но я действительно хотел бы знать, как поступить с регулярным выражением, если это возможно, конечно.

2. Я не уверен, возможно ли это. Возможно, но это было бы очень сложно. Что не так с xpath, они очень просты в использовании в PHP, просто найдите в SO всю необходимую информацию.

3. Ничего плохого, мне просто было интересно, возможно ли это сделать с помощью регулярного выражения. Так что еще раз спасибо. Я использую xpath!