加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP Xpath – 解析平面HTML结构

发布时间:2020-12-13 16:22:29 所属栏目:PHP教程 来源:网络整理
导读:我试图解析一些相当平坦的 HTML并将所有内容从一个h1标签分组到下一个标签.例如,我有以下HTML: h1 Heading 1 /h1p Paragraph 1.1 /pp Paragraph 1.2 /pp Paragraph 1.3 /ph1 Heading 2 /h1p Paragraph 2.1 /pp Paragraph 2.2 /ph1 Heading 3 /h1p Paragraph
我试图解析一些相当平坦的 HTML并将所有内容从一个h1标签分组到下一个标签.例如,我有以下HTML:

<h1> Heading 1 </h1>
<p> Paragraph 1.1 </p>
<p> Paragraph 1.2 </p>
<p> Paragraph 1.3 </p>
<h1> Heading 2 </h1>
<p> Paragraph 2.1 </p>
<p> Paragraph 2.2 </p>
<h1> Heading 3 </h1>
<p> Paragraph 3.1 </p>
<p> Paragraph 3.2 </p>
<p> Paragraph 3.3 </p>

我基本上希望它看起来像:

<div id='1'>
    <h1> Heading 1 </h1>
    <p> Paragraph 1.1 </p>
    <p> Paragraph 1.2 </p>
    <p> Paragraph 1.3 </p>
</div>
<div id='2'>
    <h1> Heading 2 </h1>
    <p> Paragraph 2.1 </p>
    <p> Paragraph 2.2 </p>
</div>
<div id='3'>
    <h1> Heading 3 </h1>
    <p> Paragraph 3.1 </p>
    <p> Paragraph 3.2 </p>
    <p> Paragraph 3.3 </p>
</div>

甚至可能不值得发布我到目前为止所做的代码,因为它只是变得一团糟.基本上我试图为’// h1’做一个Xpath查询.创建新的DIV标记作为父节点.然后将h1 DOM节点复制到第一个DIV中,然后遍历nextSibling,直到我点击另一个h1标签 – 如上所述它变得混乱.

有人能指点我在这里更好的方向吗?

解决方法

迭代在同一级别上的所有节点(我在示例中创建了一个名为platau的提示节点),每当你在< h1>上运行时,在之前插入div并保持对它的引用.

对于< h1>和任何其他节点,如果引用存在,删除节点并将其作为子节点添加到引用.

例:

$doc->loadXML($xml);
$xp = new DOMXPath($doc);

$current = NULL;
$id = 0;
foreach($xp->query('/platau/node()') as $i => $sort)
{
    if (isset($sort->tagName) && $sort->tagName === 'h1')
    {
        $current = $doc->createElement('div');
        $current->setAttribute('id',++$id);
        $current = $sort->parentNode->insertBefore($current,$sort);
    }
    if (!$current) continue;

    $sort->parentNode->removeChild($sort);
    $current->appendChild($sort);
}

Demo

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读