парсинг вложенных тегов

young

Новичок
парсинг вложенных тегов

Есть тест, содержащий как сложенные так и послеловательные парные теги, например:

<mytag>
some text
<mytag>
<mytag>
</mytag>
</mytag>
<mytag>
</mytag>
</mytag>

some text

<mytag>
</mytag>

Требуется удалить всю вложенность этих тегов, т.е. приведенный выше пример должен выглядеть так:

<mytag>
some text
</mytag>

some text

<mytag>
<mytag>
 

slach

Новичок
запускаешь обычный SAX Expat парсер
http://php.net/manual/en/ref.xml.php

см. xml_parse

и там отлавливаешь события и выставляешь флаг
типа current_state со следующими значениями:
_начало_тега_
_содержимое_ (выставляется только тогда когда обрезанные от лишних символов CDATA данные не будут пустыми)
_конец_тега_

если _конец_тега_ следует СРАЗУ ПОСЛЕ _начало_тега_,
тогда тег в РЕЗУЛЬТИРУЮЩИЙ документ не пишется...
 

young

Новичок
Видишь ли, мне надо вырезать только сами теги, но содержимое оставить.

XML я использовать не хочу, он требует специфической настройки PHP и как он отреагирует на некоректную вложенность?
 

young

Новичок
Он может проглючить но отработать:

Скажем такое

<mytag>text<mytag>
</mytag>
преобразовать к

<mytag>
text
</mytag>
<mytag>

либо
<mytag>
text

мне неважно каков будет результат их этиъ двух. Но хоть как-то он должен отреагировать.
 

Crazy

Developer
Автор оригинала: young
Он может проглючить но отработать:
Вот xml-парсер тоже отработает, выдав пустой результат.

Итак, ПРЕДПОЛОЖИМ, что ты осознаешь алгоритм обработки неверной вложенности тэгов.

1. используя следующий код проводишь лексический аналог своего текста. В результате получаешь список элементов, которыми будет тэги и тексты:

PHP:
preg_match_all("/<[^>]+>|[^<>]+/",$text,$matched);
2. Парсишь набор лексем, используя стэковый автомат.

В пункте (2) и потребуется понимание, о котором я спрашивал.
 

shingrus

Guest
Автор оригинала: HEm
или подумай над регулярным....
насчёт вложенных тегов ну-ну, советчик...
хотелось бы посмотреть на регу, которая корректно отработает несколько веток <ul>
 

HEm

Сетевой бобер
Автор оригинала: shingrus
насчёт вложенных тегов ну-ну, советчик...
хотелось бы посмотреть на регу, которая корректно отработает несколько веток <ul>
в цикле убираются пустые пары тегов <sometag></sometag>, повторов 10 вполне хватит имхо
а лучше конечно посмотреть на код который генерит такую фигню и поправить его....
 

camel

Новичок
зачем писать парсер не понимаю....
тебе скорее подойдет XSLT, преобразование XML это по его части
 

Crazy

Developer
Автор оригинала: HEm
в цикле убираются пустые пары тегов <sometag></sometag>,
Ты невнимательно читал пример исходного текста. Там проблема не в пустых парных тэгах.
 

Crazy

Developer
Автор оригинала: camel
тебе скорее подойдет XSLT, преобразование XML это по его части
Ты уже познал дао использования XSLT для обработки невалидного XML-документа? Перечитай четвертое письмо треда.
 

young

Новичок
Автор оригинала: Crazy
Ты уже познал дао использования XSLT для обработки невалидного XML-документа? Перечитай четвертое письмо треда.
Если это было ео мне, то нет.

А в прикол?
 

Фокся

Guest
Re: парсинг вложенных тегов

Автор оригинала: young
Есть тест, содержащий как сложенные так и послеловательные парные теги, например:

<mytag>
some text
<mytag>
<mytag>
</mytag>
</mytag>
<mytag>
</mytag>
</mytag>

some text

<mytag>
</mytag>

Требуется удалить всю вложенность этих тегов, т.е. приведенный выше пример должен выглядеть так:

<mytag>
some text
</mytag>

some text

<mytag>
<mytag>
можно вот так к примеру
$tst_str='<mytag>
some text
<mytag>
<mytag>
</mytag>
</mytag>
<mytag>

</mytag></mytag>some text<mytag></mytag>';

$tst_str=preg_replace("/(\r\n)|\r|\n/", '', $tst_str);
preg_match_all("/<([^>]+)>/",$tst_str,$matched);
$match=array_unique($matched[1]);
foreach($match as $v)
{
$pattern="/(<$v><$v>)|(<\/$v><$v>)|(<$v><\/$v>)|(<\/$v><\/$v>)/i";
$tst_str1=@preg_replace($pattern, '', $tst_str);
if($tst_str1)
$tst_str=$tst_str1;
}
echo $tst_str;
 

young

Новичок
Все не так просто

а проблему решил уже давно

всем спасибо
 
Сверху