# Двухэтапный парсинг блоков через регулярки в 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>`
←→
↑