PHP Xpath – 解析平面HTML结构

发布时间:2022-04-30 发布网站:脚本宝典
脚本宝典收集整理的这篇文章主要介绍了PHP Xpath – 解析平面HTML结构脚本宝典觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图解析一些相当平坦的 HTML并将所有内容一个h1标签分组到下一个标签.例如,我有以下HTML: @H_404_7@

@H_404_7@

<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>
@H_404_7@我基本上希望它看起来像:

@H_404_7@

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

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

解决方法

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

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

@H_404_7@例:

@H_404_7@

$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);
}
@H_404_7@Demo

脚本宝典总结

以上是脚本宝典为你收集整理的PHP Xpath – 解析平面HTML结构全部内容,希望文章能够帮你解决PHP Xpath – 解析平面HTML结构所遇到的问题。

如果觉得脚本宝典网站内容还不错,欢迎将脚本宝典推荐好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。