【发布时间】:2017-08-31 00:49:01
【问题描述】:
我正在尝试在 php 中使用 DOMDocument::loadHTML 编辑 html 标签。 html 数据是 html 的一部分,而不是整个页面。我按照此页面 (PHP - DOMDocument - need to change/replace an existing HTML tag w/ a new one) 的说明进行操作。
这应该将 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();
?>
[编辑] 当我尝试向后迭代节点对象时,我收到此错误,“注意:尝试获取非对象的属性...”
<?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();
?>
[编辑] 好的,解决了。由于回答的代码有一些错误,我在这里发布了解决方案。谢谢大家。
解决办法:
<?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();
?>
【问题讨论】:
-
我知道这是 PHP 的问题。关闭节点并编辑克隆的节点怎么样?与正则表达式解决方案相比,这慢吗?
-
不是PHP的问题。如果您向后迭代 NodeList,您应该能够替换所有
pre标记。如果这不起作用,将逻辑更改为效率较低的版本,替换第一个匹配,再次调用getElementsByTagName,替换第一个匹配... -
迭代 backwars 是个好主意。我试试看。
-
我更新了最初的帖子。我在尝试执行您的建议时遇到了另一个错误。