PHP DomNode-> insertBefore()

时间:2012-09-28 14:01:07

标签: html domdocument php

我正在尝试在我的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

1 个答案:

答案 0 :(得分:9)

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

假设您想要使用锚点添加所有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