我正在尝试在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
最佳答案
代码没有任何意义。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