我希望我能得到你们的帮助。
这就是我正在努力的方面, 我有一串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()
,但我也试过{{1}},但没有成功。
我使用JavaScript,但是我需要用PHP实现同样的功能,但是使用PHP来使用DOM会非常复杂。
提前谢谢。
答案 0 :(得分:4)
这是结果:
$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]
内的通讯内容。
答案 1 :(得分:2)
您可以尝试以下方式:
preg_split("/<h4>.+</h4>/i", $html);
答案 2 :(得分:1)
这应该做你想要的 - 虽然我确定还有其他(可能更好)的方式
$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以获得完整性
答案 3 :(得分:0)
你可以使用相同的代码,只需稍加改动,它就会适用于各种非正常的 HTML。
$html_string = 'HTML string';
$dom = new DOMDocument();
$dom->loadHTML($html_string);
$content = [];
$value = '';
foreach($dom->getElementsByTagName('h4') as $node) {
$title = $dom->saveHTML($node);
$content[$k]['key'] = $title;
while(($node = $node->nextSibling) && $node->nodeName !== 'h4') {
$value .= $dom->saveHTML($node);
}
$content[$k]['value'] = $value;
}
echo '<pre>';
print_r($content);die;