【问题标题】:PHP Split html string into arrayPHP将html字符串拆分为数组
【发布时间】:2014-11-12 18:17:05
【问题描述】:

希望能得到大家的帮助。

这就是我正在努力解决的问题, 我有一个 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)

我需要将所有&lt;h4&gt; 与其余内容分开,但例如第一个&lt;h4&gt; 之后和第二个&lt;h4&gt; 之前的内容需要与第一个&lt;h4&gt; 相关联,例如这个:

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>
}

这是为了构建一个手风琴(很难解释我为什么要这样做,但它必须是这样),&lt;h4&gt; 将是手风琴面板的标题,单击时它将展开并显示与它们相关的内容。

我希望我把我的问题说清楚了,让我知道你的想法以及我应该如何更好地做到这一点。

我正在研究DOMDocument,但我也尝试过explode(),但没有成功。

我用 JavaScript 来做这个,但我需要用 PHP 来实现同样的事情,但是用 PHP 来玩 DOM 是相当复杂的。

提前谢谢你。

【问题讨论】:

  • DOMDocument 可能有点难,但还不错。
  • 是的,它总是有 h4 后跟任何类型的 HTML 代码,除了 h4,唯一的 h4 是标题。所以是的,我相信它会一直这样。
  • @DerekS 谢谢,这有帮助,走在正确的轨道上,只需要稍微修改代码就可以像我想要的那样工作。谢谢。

标签: php html arrays accordion domdocument


【解决方案1】:

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

结果如下:

$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]中的对应内容。

【讨论】:

    【解决方案2】:

    你可以试试这样的:

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

    【讨论】:

    • 您的模式缺少开始和结束分隔符。最好添加不区分大小写的标签
    • 糟糕!一定很着急……修好了!
    • 谢谢@zack.lore 我很感激,但是用之前的代码找到了解决方案。
    • preg_split 绝对不是这里想要使用的函数,preg_match 更合适。我花了一个多小时才意识到 preg_split 实际上从源中删除了所有匹配项,而我(和 OP)需要的是所有匹配项的数组。
    【解决方案3】:

    这应该做你想做的——尽管我确信还有其他(可能更好)的方法

    $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 以确保完整性

    【讨论】:

    • 其他方式是在 /

      .*

      / 上拆分正则表达式,例如
    • 如果你的“h4”实际上是“H4”(大写)或者你有一个杂散的空间(比如“/h4”),这将不起作用。换句话说,它适用于您可以控制的干净的 HTML。
    • 我知道,这只是对其他方式的提示,但谢谢 ;)
    • @UnskilledFreak 对不起,那是对我帖子的评论——不是你的帖子,我还没有看到。我同意正则表达式拆分也可以工作。
    • 嗯,但是如果我错了,大写的 html 标签会被弃用?
    【解决方案4】:

    您可以使用相同的代码,只需稍加改动,它就会适用于各种非普通的 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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多