Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP-DOMDocument-需要更改/替换现有HTML标记和新标记_Php_Html_Dom - Fatal编程技术网

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;
}