Двухэтапный парсинг блоков через регулярки в PHP

При работе с регулярками не стоит пытаться решить сложную задачу с помощью одной регулярки. Лучше последовательно применить несколько регулярок.

Давайте посмотрим на примере. Пусть у нас есть следующий код:

<p> --- </p> <main class="header"> <p> +++ </p> <p> +++ </p> </main>

Пусть нам нужно спарсить все абзацы из тега main. Сделаем это в два этапа: сначала получим содержимое тега main, а потом внутри этого содержимого будем искать абзацы.

Итак, первый этап. Пусть текст всей страницы хранится в переменной $str1. Давайте получим содержимое тега main:

<?php preg_match('#<main[^>]*>(.+?)</main>#su', $str1, $match1); ?>

Проверим, что мы поймали правильный текст:

<?php $str2 = $match1[1]; var_dump($str2); ?>

Теперь в полученном тексте найдем все абзацы:

<?php preg_match_all('#<p[^>]*>(.+?)</p>#su', $str2, $match2, PREG_PATTERN_ORDER); ?>

Проверим, что мы нашли тексты наших абзацев:

<?php var_dump($match2[1]); ?>

Спарсите все теги h2 из тега aside:

<main> <h2>---</h2> </main> <aside> <h2>+++</h2> <p> text </p> <h2>+++</h2> <p> text </p> <h2>+++</h2> <p> text </p> </aside>



Чат с GPT Компилятор