Разделение HTML-контента по главам

Я получил html-строку в переменной, которая выглядит примерно так:

<h1>Title 1</h1>
Introduction
<h2>Chapter 1</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>
<h2>Chapter 2</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>

<h1>Title 2</h1>
Introduction
<h2>Chapter 1</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>
<h2>Chapter 2</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>

Для дальнейшей обработки мне нужны эти «блоки» в переменной (массиве). Прежде всего, главная глава, которая начинается с <h1> и идет к следующему <h1> должен быть отделен.

Я пытался использовать explode() с разделителем <h1 Но это удаляет часть самого тега.

И в качестве второго шага мне также нужно разделить главу каждого «блока». На последнем шаге мне нужно получить описание содержания главы.

Я думаю, что ключ — это первый шаг: разбить всю вещь на главу в массив. После этого я могу обрабатывать «субблоки» в цикле foreach или что-то еще с той же техникой (я думаю).

0

Решение

Хорошо. Нет проблем. использование explode() функция. Удаляет <h1 Вы можете легко добавить <h1 себя так

<?php
$html = '<h1>Title 1</h1>
Introduction
<h2>Chapter 1</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>
<h2>Chapter 2</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>

<h1>Title 2</h1>
Introduction
<h2>Chapter 1</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>
<h2>Chapter 2</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>
';

$html = explode('<h1', $html);
for ($i = 0 ; $i < count($html) ; $i++) $html[$i] = '<h1' . $html[$i];
unset($html[0]); //if <h1 is on the beginning of string
print_r(var_dump($html));

Кстати, вы можете удалить первый индекс, если он пуст. (Так как <h1 в начале вашей строки) вы можете даже добавить это в свой for:

if ($html[$i] == '') unset($html[$i]);

Ответ на ваш комментарий:

Если вы хотите разделить <h2 тоже вы можете сделать то же самое снова, но с h2 разделитель:

<?php
$html = '<h1>Title 1</h1>
Introduction
<h2>Chapter 1</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>
<h2>Chapter 2</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>

<h1>Title 2</h1>
Introduction
<h2>Chapter 1</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>
<h2>Chapter 2</h2>
<p>Always just one line</p>
<p class="description">Some more text.</p>
<p class="description">Maybe with multiple lines.</p>
';

$html = explode('<h1', $html);
for ($i = 0 ; $i < count($html) ; $i++) $html[$i] = '<h1' . $html[$i];

// h2:

for ($i = 0 ; $i < count($html) ; $i++){
$html[$i] = explode('<h2', $html[$i]);
for ($j = 0 ; $j < count($html[$i]) ; $j++) if(strpos($html[$i][$j],'>') == 0) $html[$i][$j] = '<h2' . $html[$i][$j];
}
unset($html[0]);
print_r(var_dump($html));
2

Другие решения

Как уже упоминалось в комментарии, вы могли бы explode('\n', $string) а затем перебрать все строки, переключаясь на следующую главу, если strpos($line, '<h1>') !== false,

Тем не менее, вы не можете извлечь элементы HTML из строки, используя простые инструменты строки. Попробуйте использовать DOMDocument :: loadHTML () вместо.

0

По вопросам рекламы [email protected]