Xpoint
   [напомнить пароль]

Выпарсить вложенный div регулярным выражением

Метки: [без меток]
2011-12-29 02:07:02 [обр] Sergio[досье]

Подскажите по регулярному выражению. Нужно распарсить вложенный <div>. Пример текста в очень упрощенном виде:

 <div id="tovar-head-tv" class="t1">Название товара</div>
<div>Описание товара</div>
<div style="display:block">
<div>товар1</div>
<div>товар2</div>
</div>
<div id="tovar-head-radio" class="t1">Название товара</div>
<div>Описание товара</div>
<div style="display:none">
<div>товар1</div>
<div>товар2</div>
<div>товар3</div>
</div>

Нужно вырезать весь текст от одного id="tovar-head" - до другого, тоесть получить кусок текста от
<div id="tovar-head-tv" class="t1"> до </div> перед <div id="tovar-head-radio"
Такой вараинт останавливается на первом </div>
preg_match_all('/<div id="tovar-head-(.*)"(.+)<\/div>/isU',$data,$tovars);
а если убрать ограничение жадности U, то вырезает текст до конца документа.
Спасибо за подсказку.

спустя 24 минуты [обр] Jared(3/26)[досье]
Не используйте регулярки для парсинга HTML. Для этого есть DOM.
спустя 16 минут [обр] Sergio[досье]
Документ большой, криво слепленный, много диза и работа через DOM начинает сильно подтормаживать.
спустя 3 часа 21 минуту [обр] Jared(3/26)[досье]

Sergio[досье], выкиньте незначимые части, сделайте очистку и восстановление документа если нужно. Регэкспы в определенных простых случаях для парсинга XML/SGML применимы. Но это точно не тот случай.

Если все же желаете прострелить себе ногу, и наплодить уродливого write-only кода, регэксп должен быть что-то вроде:

/<div id="tovar-head-.*?(?=<div id="tovar-head|$)/

То есть - все, что начинается с '<div id="tovar-head-' и до первого появления '<div id="tovar-head' (но само это появление в результат не включать) или конца строки. Так как блок с товарами не изолирован, то в последний товар попадет все до конца документа. Вместо $ используйте другой признак конца блока с товарами.

спустя 12 часов [обр] Marat Tanalin(3/78)[досье]
Sergio[досье]
Ищите подстроку id="tovar-head-, затем такую же в оставшемся фрагменте строки, отматывайте назад до ближайшего </div> и вырезайте нужную подстроку по полученным символьным позициям.
спустя 1 день 4 часа [обр] Sergio[досье]
Спасибо за советы, сделать побольше алгоритм для вырезания не проблема, но думал, что можно будет одним оператором все это сделать :)
спустя 2 дня 15 часов [обр] Sergio[досье]
To Jared - дошли руки проверить предложенный вариант с опережающей проверкой, спасибо, это то что и требовалось.
Powered by POEM™ Engine Copyright © 2002-2005