Я получил 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 или что-то еще с той же техникой (я думаю).
Хорошо. Нет проблем. использование 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));
Как уже упоминалось в комментарии, вы могли бы explode('\n', $string)
а затем перебрать все строки, переключаясь на следующую главу, если strpos($line, '<h1>') !== false
,
Тем не менее, вы не можете извлечь элементы HTML из строки, используя простые инструменты строки. Попробуйте использовать DOMDocument :: loadHTML () вместо.