PHP - DOMDocument - 需要更改/替换现有的HTML标签

时间:2011-01-28 03:15:37

标签: php html dom

我正在尝试将文档中的所有<P>代码更改为<DIV>。这就是我想出来的,但它似乎不起作用:

$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>

2 个答案:

答案 0 :(得分:9)

您要将div追加到p <p><div></div></p>,结果为p,移除$divnode->createElement()会删除所有内容。
如果$divnode未初始化,则div将无效。

请改为使用DOMDocument::replaceChild()(dom中p的位置与foreach( $dom->getElementsByTagName("p") as $pnode ) { $divnode = $dom->createElement("div", $pnode->nodeValue); $dom->replaceChild($divnode, $pnode); } s相同。

{{1}}

答案 1 :(得分:0)

来自this answer

的增强功能
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;
}