PHP-DOMDocument-需要更改/替换现有HTML标记和新标记
我正在尝试将文档中的所有PHP-DOMDocument-需要更改/替换现有HTML标记和新标记,php,html,dom,Php,Html,Dom,我正在尝试将文档中的所有标记更改为。这是我想到的,但似乎不起作用: $dom = new DOMDocument; $dom->loadHTML($htmlfile_data); foreach( $dom->getElementsByTagName("p") as $pnode ) { $divnode->createElement("div"); $divnode->nodeValue = $pnode->nodeValue; $pno
标记更改为
。这是我想到的,但似乎不起作用:
$dom = new DOMDocument;
$dom->loadHTML($htmlfile_data);
foreach( $dom->getElementsByTagName("p") as $pnode ) {
$divnode->createElement("div");
$divnode->nodeValue = $pnode->nodeValue;
$pnode->appendChild($divnode);
$pnode->parentNode->removeChild($pnode);
}
这就是我想要的结果:
之前:
<p>Some text here</p>
这里有一些文本
之后:
<div>Some text here</div>
这里有一些文本
您将div
附加到p
中,这将导致
,删除p
将删除所有内容。另外,
$divnode->createElement()
在未初始化$divnode
时将不起作用
尝试使用(dom中的div
s位置将与p
s位置相同)
增强的功能来自
注意:如果
$pnode->nodeValue
不是纯文本,但其中有额外的节点,则只剩下文本(html将被剥离)。你不能在迭代时替换项目,因为索引发生了变化,结果会很奇怪。猜猜看:我在回答时实际测试了这个问题。因此,如果您使用最新的PHP版本,foreach可以处理索引的操作。正如Sanne所说,对于多个项目,它们将是一个错误。检查这个答案,这样行吗
foreach( $dom->getElementsByTagName("p") as $pnode ) {
$divnode = $dom->createElement("div", $pnode->nodeValue);
$dom->replaceChild($divnode, $pnode);
}
function changeTagName( $node, $name ) {
$childnodes = array();
foreach ( $node->childNodes as $child ) {
$childnodes[] = $child;
}
$newnode = $node->ownerDocument->createElement( $name );
foreach ( $childnodes as $child ){
$child2 = $node->ownerDocument->importNode( $child, true );
$newnode->appendChild($child2);
}
if ( $node->hasAttributes() ) {
foreach ( $node->attributes as $attr ) {
$attrName = $attr->nodeName;
$attrValue = $attr->nodeValue;
$newnode->setAttribute($attrName, $attrValue);
}
}
$node->parentNode->replaceChild( $newnode, $node );
return $newnode;
}