Регулярка. Вопрос по странной задаче :)
собственно сабж: требуется занескти в массив те блоки, которые не являются вложенными, если в них есть вложения, то надо, чтобы эти вложения также сохранялись в элементе. пример(упрощенный):
<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.если знаете как по-другому можно реализовать это, то тоже напишите.
Оформите код, пожалуйста, ведь сложно читать
Цитата: BOSppRU
P.S.если знаете как по-другому можно реализовать это, то тоже напишите.
Есть еще минимум 2 способа: через DOM и через XSLT.
Да и поиск рулит, учимся пользоваться им:
Цитата: alekciy
Да и поиск рулит, учимся пользоваться им:
http://www.shtogrin.com/library/web/pcre/examples/get_html_text/
http://www.shtogrin.com/library/web/pcre/examples/get_html_text/
А если всётаки учесть, что в моём посте написано что данный подход не делает того что мне надо?
Он не извлечёт ПРАВИЛЬНО внешний шаблон
Цитата: 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);
?>
$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);
?>
Остальное надеюсь сам сообразишь.