Разбор HTML с помощью PCRE, требуется свежий взляд

freeforsnak

Новичок
Разбор HTML с помощью PCRE, требуется свежий взляд

Искал долго и упорно в мане, потом на форуме, не помогло. :(
Если уже было чего подобное, прошу не пинать ногами, а указать дислокацию обсуждения.

Буду краток:
Задача такова: на вход после WYSIWYG приходит отформатированый HTML, надо разбить его в массив на части по тэгу <H1-6>.
Пример:
------------------------------
< H1 >some headers1< /H1 >some text 1
< H2>headers2</H2>some text 2
<H2>headers2_2</h2>some text 3
<H3 align="center">headers3_1< /h3 >some text 4
<H2>headers2_2</h2>some text 3

< H1 >some headers1_2< /H1 >some text 5
<H3>headers3_2</h3>some text 6
------------------------------
На выходе должно выйти

array{
[0]=>array{[0]=>"some headers1", [1]=>"H1", [2]=>"some text 1 "},
[1]=>array{[0]=>"headers2", [1]=>"H2", [2]=>"some text 2 "},
[2]=>array{[0]=>"headers2_2", [1]=>"H2", [2]=>"some text 3 "},
[3]=>array{[0]=>"headers3_1", [1]=>"H3", [2]=>"some text 4 "},
и т.д.
}

Пытался сделать с помощью preg_match_all:
$st -- входящий текст;
$witheaders -- регулярка;
$ar_2 -- выходной массив;
PHP:
$witheaders ='/<\s*(H[1-6]{1}){1}.*>(.*)<\s*\/\1{1}.*>(.*)/Uis';

$w=preg_match_all($witheaders,$st,$ar_2,PREG_SET_ORDER);
текст в <Hx></Hx> берет, уровень берет, а текст ну никак не попадает в результат :(((

Прошу подсказать, как вылечить, ибо разнообразные извращения с регуляркой не принесли плодов, чего-то аж башню начинает сносить -- во сне регулярки составляю 8()
----
P.S. Linux+Apache1.3.33+PHP4.0.3
P.P.S.Не обязательно тэги правильно оформлены(пробельные символы около < и >), наведенный пример вполне реален.
 

freeforsnak

Новичок
Re: Разбор HTML с помощью PCRE, требуется свежий взляд

------------------------------
< H1 >some headers1< /H1 >some text 1
< H2>headers2</H2>some text 2
<H2>headers2_2</h2>some text 3
<H3 align="center">headers3_1< /h3 >some text 4
<H2>headers2_2</h2>some text 3

< H1 >some headers1_2< /H1 >some text 5
<H3>headers3_2</h3>some text 6
------------------------------
На выходе должно выйти

array{
[0]=>array{[0]=>"some headers1", [1]=>"H1", [2]=>"some text 1 "},
[1]=>array{[0]=>"headers2", [1]=>"H2", [2]=>"some text 2 "},
[2]=>array{[0]=>"headers2_2", [1]=>"H2", [2]=>"some text 3 "},
[3]=>array{[0]=>"headers3_1", [1]=>"H3", [2]=>"some text 4 "},
и т.д.
}
Выходит:
array{
[0]=>array{[0]=>"< H1 >some headers1< /H1 >", [1]=>"H1", [2]=>"some headers1",[3]=>""},
и т.д.
}
Порядок следования индексов, как понимаете, совершенно не важен, главное, что в [3](в верхнем примере это [2]) -- не попадает содержимое того текста, который находится после закрывающего тэга </Hx>
 

freeforsnak

Новичок
Автор оригинала: Popoff
[m]preg_split[/m]
Изначально смотрел в эту сторону, но не понравилось, что разбивает в одномерный массив.

вывод preg_match_all для меня в этом плане ГОРАЗДО удобнее.
Выхода нет -- придется сплитом.


Спасибо за совет, сплитом конечно все получается.

Все-же интересует первый вариант: где проблемма -- в регулярке или в preg_match_all?

Или, может, в моем непонимании каких-то вещей?
 
Сверху