Регулярное выражение - разбивка статьи на подразделы по <H2>...</H2>

Кинотавр

Новичок
Регулярное выражение - разбивка статьи на подразделы по <H2>...</H2>

Есть следующая задача. Имеется статья с подразделами и подзаголовками, оформленными тегами <H2>...</H2>.
В базе данных статья хранится в виде единого текста. А выводиться она должна в виде нескольких страниц, каждый подзаголовок с соответствующим текстом подраздела - на отдельной странице. Рядом со статьей, в боковой колонке, навигация по этой статье.

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

У меня нормально получилось сделать регулярное выражение для вытаскивания содержимого подзаголовков и генерации на основе них менюшки с навигацией по статье.

PHP:
preg_match_all("!<H2>(.*?)</H2>!si",$row[text],$array);
Но вот с вытаскиванием заголовка подраздела вместе с текстом подраздела возникла проблема. Вроде по логике надо вытаскивать содержимое между тегами </H2>...<H2>. То есть, между предыдущим закрывающим тегом заголовка и следующим открывающим.

PHP:
preg_match_all("!</H2>(.*?)<H2>!si",$row[text],$array);
А потом полученное содержимое приклеивать к заголовку. Но тут возникает проблема, что при этом теряется содержимое последнего подраздела, ведь после него нет следующего открывающего <H2>.

Прошу помочь тех, кто хорошо разбирается в регулярных выражениях. Чувуствую, что ничего сложного здесь нет, но для меня тема регулярных выражений - кромешная тьма. А может быть вы поможете составить единое регулярное выражение, без склеиваний заголовка с содержимым подраздела? То есть, чтобы одним регулярным выражением вытаскивалось сразу содержимое от предыдущего <H2> до следующего <H2>, причем чтобы предыдущий присутствовал в результате запроса, а следующий не присутствовал, и чтобы еще последний подраздел тоже попадал в выборку.

Прошу помочь.
Спасибо.
 

Кинотавр

Новичок
Спасибо за помощь, конечно. Но ведь надо еще составить регулярное выражение, верно? Мне этого недостаточно для решения задачи. ;) Так что, воистину ду хаст мих гефрахт унд их хаб нихтс гезахтс. ;)
 

Bitterman

Новичок
дык выражение у тебя уже составлено вроде.
Ты хоть посмотрел, что делает функция, про которую я тебе написал?
 

spiverg

Новичок
Попробуй так

/<h2>(.*?)<\/h2>(.*?)(?=<h2>|$)/is

в одном кармане будет заголовок в другом текст, позитивный просмотр также обеспечивает выборку последнего результата за счет |$
 

Rin

*
Кинотавр
preg_split + PREG_SPLIT_DELIM_CAPTURE однозначно (см. как следует документацию)
рег. выражение Вы уже сами написали (первое)
 

Кинотавр

Новичок
Спасибо, коллеги. Воспользовался вашими советами, в результат правильный запрос получился такой.
PHP:
$array = preg_split("!<H2>(.*?)</H2>!si",$row[text],-1,PREG_SPLIT_DELIM_CAPTURE);
 
Сверху