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

Ваш аккаунт

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

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

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

Регулярка. Вопрос по странной задаче :)

16K
06 октября 2007 года
BOSppRU
11 / / 21.10.2006
Итак, есть некий xml-подобный документ, содержащий в себе некие блоки <p>. Блдококв может быть скольугодно много и они могут быть вложенными.

собственно сабж: требуется занескти в массив те блоки, которые не являются вложенными, если в них есть вложения, то надо, чтобы эти вложения также сохранялись в элементе. пример(упрощенный):

<p>
lalala
</p>
fdfh
<p>
dgdg
<p>123</p>
dfgdgh
</p>


должен вернуть 2 блока в массиве:
1)<p>
lalala
</p>

2)<p>
dgdg
<p>123</p>
dfgdgh
</p>


Моё решение:
1)пробывал так:
%<p>(?:.*)</p>%si

и ещё несколько модификаций-с ограниченямми "?" и тд - не получилось

Собственно хочу узнать ,можно ли используя рег. выражение получить требуемые мне данные. запрос ющзю preg_match_all, хотя я думаю это не суть важно.



РЕАЛЬНЫЙ ПРИМЕР(под который я всё и делаю):

текст для обработки:

drfgdgd
sdfgfgdfg
fgdfgfdfgdfg
dfgddfgdfg
<rkt::block name="new">000123456
<rkt::block name="st1">olsdfffgsrg</rkt::block>
000</rkt::block>
dfgdfgf
<rkt::block name="nw">olsdfffgsrg</rkt::block>
fdgdgf


должен возвратить массив из:
1)<rkt::block name="new">000123456
<rkt::block name="st1">olsdfffgsrg</rkt::block>
000</rkt::block>

2)<rkt::block name="nw">olsdfffgsrg</rkt::block>


Решение нужно сделать регуляркой. массив не обязан иметь такую структуру как я показал, главное-чтобы эти 2 блока выделились в отдельный элемент.

Предложения типа добавить уникальны идентификатор и тд-в трэш - никаких изменений исходного кода не должно быть.

Заранее благодарю за советы.


P.S.если знаете как по-другому можно реализовать это, то тоже напишите.
251
06 октября 2007 года
SkyMаn
1.7K / / 31.07.2007
Оформите код, пожалуйста, ведь сложно читать
12
06 октября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: BOSppRU

P.S.если знаете как по-другому можно реализовать это, то тоже напишите.


Есть еще минимум 2 способа: через DOM и через XSLT.

12
06 октября 2007 года
alekciy
3.0K / / 13.12.2005
Да и поиск рулит, учимся пользоваться им:
http://www.shtogrin.com/library/web/pcre/examples/get_html_text/
16K
07 октября 2007 года
BOSppRU
11 / / 21.10.2006
Цитата: alekciy
Да и поиск рулит, учимся пользоваться им:
http://www.shtogrin.com/library/web/pcre/examples/get_html_text/


А если всётаки учесть, что в моём посте написано что данный подход не делает того что мне надо?
Он не извлечёт ПРАВИЛЬНО внешний шаблон

12
07 октября 2007 года
alekciy
3.0K / / 13.12.2005
Цитата: BOSppRU
А если всётаки учесть, что в моём посте написано что данный подход не делает того что мне надо?
Он не извлечёт ПРАВИЛЬНО внешний шаблон


Да... учитывая, что у тебя требуется извлеч содержимое тега на определенном уровне иерархии да еще и могут быть вложенные теги с таким же именем, то регулярками тут так просто не отделаешься... Ситуацию может немног поправить модификатор жадности U, но полностью ситуацию он не решит.

Есть еще одни метод: посимвольное чтение файла с отметкой уровня иерархии и отслеживании вложенных тегов. В принципе не сложная задача, но будет желание сам её реализуешь. Из готового могу предложить такой вот класс: DOMDocumentL0 с таким вот кодом использования:

Код:
<?php
$text = <<<XML
<?xml version="1.0" encoding="utf-8"?>
<root>
<p>
lalala
</p>
fdfh
<p>
dgdg
<p>123</p>
dfgdgh
</p>
</root>
XML
;
include_once('DOMDocumentL0.php');
$doc = new DOMDocumentL0();
$doc->loadXML($text);
$p_list = $doc->XPath->query('/root/p');
$rezult = array();
foreach ($p_list as $key => $val)
{
    $rezult[] =  $doc->innerHTML($p_list->item($key), true);
};
print_r($rezult);
?>

Остальное надеюсь сам сообразишь.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог