【问题标题】:PHP DomNode->insertBefore()PHP DomNode->insertBefore()
【发布时间】:2012-09-28 14:01:06
【问题描述】:

我正在尝试在我的 html 字符串中插入节点。 我的目标是在每个 h2 标签之前插入一个元素。

为此,我正在使用:

$htmlString = "<h2>some html</h2>";

$DOM = new DOMDocument();
$DOM->loadHTML($htmlString);

$itemTitles = $DOM->getElementsByTagName('h2');

for($i = 0; $i < $itemTitles->length; $i ++)
{
    $helpNavigatorContents[] = $itemTitles->item($i)->nodeValue;
    $textBefore = new DOMNode(
        '<a name="'.$itemTitles->item($i)->nodeValue.'"></a>'
    );
    $itemTitles->item($i)->parentNode->insertBefore(
        $textBefore, 
        $itemTitles->item($i)
    );
}

$htmlString = $DOM->saveHTML($DOM);

这里我遇到了$textBefore 的问题。当我将$textBefore 声明为DOMText 时,我可以在节点之前插入文本,但是当我使用DOMNode 尝试此操作时,我收到以下错误(Demo):

警告:DOMNode::insertBefore():无法获取 DOMNode

【问题讨论】:

    标签: html domdocument php


    【解决方案1】:

    代码没有任何意义。 DOMNode 没有构造函数。它根本不应该被创建。您应该通过DOMDocument 创建特定的节点类型,以使它们与文档相关联。

    假设你想在所有的 H2 元素前面加上一个锚点,这是怎么做的:

    libxml_use_internal_errors(true);
    $DOM = new DOMDocument();
    $DOM->loadHTML($htmlString);
    $DOM->preserveWhiteSpace = false;
    
    foreach ($DOM->getElementsByTagName('h2') as $h2) {
        $a = $DOM->createElement('a');
        $a->setAttribute('name', $h2->nodeValue);
        $h2->parentNode->insertBefore($a, $h2);
    }
    $DOM->formatOutput = true;
    echo $DOM->saveHTML();
    

    演示http://codepad.org/N0dPcLwT

    要将 H2 元素包装到 A 元素中,只需执行相同操作并添加

    $a->appendChild($h2);
    

    演示http://codepad.org/w7Hi0Bmz

    【讨论】:

    • 非常感谢@Gordon,我会试试这个,一旦我完成,如果我还有其他问题,我会告诉你。
    • 它就像@Gordon 的魅力,唯一的想法是我想问你:添加这些标签时插入了一个新的 html 正文:渡//EN" "w3.org/TR/REC-html40/loose.dtd">
    • @Milos 是的,当您使用loadHTML 时,它将尝试修复任何损坏的 html 并添加一个最小的 HTML 框架。尽管可以在 libxml 中关闭,但无法从 PHP 中关闭它。如果您使用的是 PHP > 5.3.6,则可以使用 $DOM-&gt;loadHTML($someNode) 输出该节点的 OuterHTML。见stackoverflow.com/questions/5404941/…
    • 再次感谢您的回复。我正在使用带有 Suhosin-Patch 的 php 5.3.10-1ubuntu3.4。当我保存 html 时,我正在使用 $DOM->saveHTML($DOM);
    • @Milos 好吧,就像我说的,传递一个节点会得到 OuterHTML。如果您不想要整个 Document,请传递该文档的子树。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 2011-09-08
    • 2011-01-15
    相关资源
    最近更新 更多