регулярное выражение php, рекурсия
Допустим есть такой код:
Код:
$html = "<div id='a1'><b>someone bold text</b><a href=index.html>click me</a><span>simple text</span></div>";
$html .= "<div id='a2'>someone text</div>";
preg_match_all ("/(<([\w]+)[^>]*(id=([\"]|['])([\w]+)(\\4))[^>]*>)(.*)(<\/\\2>)/isuU", $html, $matches);
print_r($matches);
$html .= "<div id='a2'>someone text</div>";
preg_match_all ("/(<([\w]+)[^>]*(id=([\"]|['])([\w]+)(\\4))[^>]*>)(.*)(<\/\\2>)/isuU", $html, $matches);
print_r($matches);
Данное регулярное выражение найдет 2 контейнера
[html]
<div id='a1'>....</div> и <div id='a2'>....</div>
[/html]
, и соотвествующие подмаски что указаны в круглых скобках.
Задача: найти контейнер в хтмл странице (пусть это будет тег [html]<div>[/html]) [html]<div>[/html] с заданным id ДО ЕГО СОБСТВЕННОГО ЗАКРЫВАЮЩЕГО ТЕГА, т е если приведенный выше участок хтмл кода мы обрамим еще одним контейнером [html]<div id="container">[/html] :
Код:
$html = "<div id='container'>";
$html .= "<div id='a1'><b>someone bold text</b><a href=index.html>click me</a><span>simple text</span></div>";
$html .= "<div id='a2'>someone text</div>";
$html .= "</div>";
$html .= "<div id='a1'><b>someone bold text</b><a href=index.html>click me</a><span>simple text</span></div>";
$html .= "<div id='a2'>someone text</div>";
$html .= "</div>";
А) самый ПОСЛЕДНИЙ закрывающий тег [html]</div>[/html] если мы не будем применять модификатор U (модификатор жадности)
и
Б) найдет самый ПЕРВЫЙ закрывающий тег [html]</div>[/html] с использованием модификатора U
А нужно чтобы находил весь контейнер [html]<div id='container'>...</div>[/html], независимо от числа остальных контейнеров на странице (здесь переменная
Код:
$html
В документации по регулярным выражениям есть пример рекурсии, который можно задать вот такой подмаской (?R).
Я перепробовал много вариантов использования, но либо на выходе пустой массив, либо ругается интерпретатор php.
Конечная задача состоит в написании более менее универсального парсера html кода.
Конечно можно для каждого отдельного случая составлять отдельное или несколько отдельных регулярных выражений, более менее похожих на приведенное выше. Но хотелось бы найти универсальное решение, тем более что механизм Perl совместимых регулярных выражений в версиях php выше 5.2 это позволяет делать с помощью механизма подмасок (?R).
http://www.php.net/manual/en/domdocument.getelementbyid.php
Почитай про DOM (Document Object Model).