PHP разделить HTML-строку в массив

Я надеюсь, что вы можете получить некоторую помощь от вас, ребята.

Это то, с чем я борюсь,
У меня есть строка HTML, которая будет выглядеть так:

<h4>Some title here</h4>
<p>Lorem ipsum dolor</p>
(some other HTML here)

<h4>Some other title here</h4>
<p>Lorem ipsum dolor</p>
(some other HTML here)

Мне нужно разделить все <h4> от остального контента, но, например, контент после первого <h4> и перед вторым <h4> должен быть связан с первым <h4>, что-то вроде этого:

Array {
[0] => <h4>Some title here</h4>
[1] => <p>Lorem ipsum dolor</p>
}

Array {
[0] => <h4>Some other title here</h4>
[1] => <p>Lorem ipsum dolor</p>
}

Это для создания аккордеона (довольно сложно объяснить, почему я так поступаю, но так должно быть), и <h4> будут заголовками аккордеонной панели, и при нажатии они развернутся и покажут связанный с ними контент.

Надеюсь, я прояснил свою проблему, дайте мне знать о ваших мыслях и о том, как мне лучше это сделать.

Я смотрел в DOMDocumentно я тоже пробовал с explode() но безуспешно

У меня это работает с JavaScript, но мне нужно добиться того же с PHP, но довольно сложно играть с DOM с PHP.

Заранее спасибо.

1

Решение

Я смог сделать то, что хотел после пример тот Дерек С дал мне.

Это был результат:

$html_string = 'HTML string';
$dom = new DOMDocument();
$dom->loadHTML($html_string);

foreach($dom->getElementsByTagName('h4') as $node) {
$title = $dom->saveHTML($node);
$content[$title] = array();

while(($node = $node->nextSibling) && $node->nodeName !== 'h4') {
$content[$title] = $dom->saveHTML($node);
}
}

Это сохранит названия внутри $title и соответствующий контент внутри $content[$title],

4

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

Вы можете попробовать что-то вроде:

preg_split("/<h4>.+</h4>/i", $html);
2

Это должно делать то, что вы хотите — хотя я уверен, что есть другие (и, возможно, лучше) способы

$aHTML = explode("<h4>", $cHTML);
foreach ($aHTML AS $nPos => $cPanel) {
if ($nPos > 0) {
$aPanel = explode("</h4>", $cPanel);
$cHeader = "<h4>" . $aPanel[0] . "</h4>";
$cPanelContent = $aPanel[1];
}
}

Он не помещает его в указанный вами формат массива — хотя вы можете сделать это сами внутри цикла. В противном случае ваш контент может быть выведен / построен внутри цикла.

Изменить: добавлены h4 и / h4 обратно для полноты

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