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