Проблемы парсинга регулярками в PHP
Парсить теги регулярками можно только ограниченным образом. Проблема возникает, если мы парсим тег, внутри которого могут быть такие же теги.
Пусть, например, мы хотим спарсить
некоторый div
:
<div id="wrapper">
text
</div>
Как известно, внутри тегов div
могут быть и другие теги div
:
<div id="wrapper">
<div>
text
</div>
<div>
text
</div>
</div>
Получим содержимое этого блока:
<?php
preg_match('#<div\sid="wrapper">(.+?)</div>#su', $str, $match);
?>
Проверим, что мы поймали:
<?php
var_dump($match[1]);
?>
В результате будет получен текст
до первого закрывающего тега div
:
<div id="wrapper">
<div>
text
</div>
И эта проблема только регулярными выражениями
не решается. В данном случае нужно считать,
сколько тегов div
открылось и сколько
закрылось. Это выходит за рамки возможностей
регулярок.
Поэтому регулярки применимы только к тем тегам, которые не могут содержать внутри себя такие же.
Более мощным способом является использование специальных библиотек для парсинга. Такие библиотеки позволяют выбирать теги через CSS селекторы. Изучением этих библиотек мы и займемся в следующих уроках.
Перечислите теги, которые можно парсить регулярками.