用DOMDocument替换HTML中的Tag

Ten*_*eno 5 php dom

我正在尝试使用php中的DOMDocument :: loadHTML编辑html标签.html数据是html的一部分,而不是整个页面.我按照这个页面(PHP - DOMDocument - 需要更改/替换现有的HTML标签w/new)说.

这应该将pre标签转换为div标签,但是它会给出"致命错误:未捕获异常'DOMException',消息'找不到错误'."

<?php
$contents = <<<STR
<pre>hi</pre>
<pre>hello</pre>
<pre>bye</pre>
STR;

$dom = new DOMDocument;
@$dom->loadHTML($contents);

foreach( $dom->getElementsByTagName("pre") as $nodePre ) {
    $nodeDiv = $dom->createElement("div", $nodePre->nodeValue);
    $dom->replaceChild($nodeDiv, $nodePre);
}

echo $dom->saveHTML();
?>
Run Code Online (Sandbox Code Playgroud)

[编辑]当我试图向后迭代节点对象时,我收到此错误,"注意:尝试获取非对象的属性......"

<?php
$contents = <<<STR
<pre>hi</pre>
<pre>hello</pre>
<pre>bye</pre>
STR;

$dom = new DOMDocument;
@$dom->loadHTML($contents);
$domPre = $dom->getElementsByTagName('pre');
$length = $domPre->length;

    For ($i = $length; $i > -1 ; $i--) {
        $nodePre = $domPre->item($i);
        echo $nodePre->nodeValue . '<br />';
//      $nodeDiv = $dom->createElement("div", $nodePre->nodeValue);
//      $dom->replaceChild($nodeDiv, $nodePre);
    }

    // echo $dom->saveHTML();
?>
Run Code Online (Sandbox Code Playgroud)

[编辑]奥基,解决了.由于答案代码有一些错误,我在这里发布解决方案.谢谢大家.

解:

<?php
$contents = <<<STR
<pre>hi</pre>
<pre>hello</pre>
<pre>bye</pre>
STR;

$dom = new DOMDocument;
@$dom->loadHTML($contents);
$domPre = $dom->getElementsByTagName('pre');
$length = $domPre->length;

For ($i = $length - 1; $i > -1 ; $i--) {
    $nodePre = $domPre->item($i);
    $nodeDiv = $dom->createElement("div", $nodePre->nodeValue);
    $nodePre->parentNode->replaceChild($nodeDiv, $nodePre);
}

echo $dom->saveHTML();
?>
Run Code Online (Sandbox Code Playgroud)

Cza*_*ino 12

问题是打电话给replaceChild().而不是

$dom->replaceChild($nodeDiv, $nodePre);
Run Code Online (Sandbox Code Playgroud)

使用

$nodePre->parentNode->replaceChild($nodeDiv, $nodePre);
Run Code Online (Sandbox Code Playgroud)

更新

这是一个有效的代码.似乎替换多个节点存在一些问题(更多信息请访问http://php.net/manual/en/domnode.replacechild.php),因此您必须使用回归循环来替换元素.

$contents = <<<STR
<pre>hi</pre>
<pre>hello</pre>
<pre>bye</pre>
STR;

$dom = new DOMDocument;
@$dom->loadHTML($contents);

$elements = $dom->getElementsByTagName("pre");
for ($i = $elements->length - 1; $i >= 0; $i --) {
    $nodePre = $elements->item($i);
    $nodeDiv = $dom->createElement("div", $nodePre->nodeValue);
    $nodePre->parentNode->replaceChild($nodeDiv, $nodePre);
}
Run Code Online (Sandbox Code Playgroud)