Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

регулярное выражение php, рекурсия

6.7K
30 января 2010 года
svd
31 / / 17.12.2005
Добрый день.
Допустим есть такой код:

 
Код:
$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);

Данное регулярное выражение найдет 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>[/html] если мы не будем применять модификатор U (модификатор жадности)
и
Б) найдет самый ПЕРВЫЙ закрывающий тег [html]</div>[/html] с использованием модификатора U
А нужно чтобы находил весь контейнер [html]<div id='container'>...</div>[/html], независимо от числа остальных контейнеров на странице (здесь переменная
 
Код:
$html
приведена для примера, в реале она будет содержать всю html страницу).

В документации по регулярным выражениям есть пример рекурсии, который можно задать вот такой подмаской (?R).
Я перепробовал много вариантов использования, но либо на выходе пустой массив, либо ругается интерпретатор php.

Конечная задача состоит в написании более менее универсального парсера html кода.
Конечно можно для каждого отдельного случая составлять отдельное или несколько отдельных регулярных выражений, более менее похожих на приведенное выше. Но хотелось бы найти универсальное решение, тем более что механизм Perl совместимых регулярных выражений в версиях php выше 5.2 это позволяет делать с помощью механизма подмасок (?R).
386
31 января 2010 года
newcss
297 / / 05.04.2005
Смысла в регулярках не вижу абсолютно ни какого!
http://www.php.net/manual/en/domdocument.getelementbyid.php
Почитай про DOM (Document Object Model).
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог