PHP将html字符串拆分为数组

时间:2014-11-12 18:17:06

标签: php html arrays accordion domdocument

我希望我能得到你们的帮助。

这就是我正在努力的方面, 我有一串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会非常复杂。

提前谢谢。

4 个答案:

答案 0 :(得分:4)

我能够按照example给我的Derek S做我想做的事。

这是结果:

$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;