gpt4 book ai didi

php - 用 DOMDocument 替换 HTML 中的标签

转载 作者:可可西里 更新时间:2023-11-01 13:40:20 30 4
gpt4 key购买 nike

我正在尝试在 php 中使用 DOMDocument::loadHTML 编辑 html 标签。 html 数据是 html 的一部分,而不是整个页面。我按照此页面 ( PHP - DOMDocument - need to change/replace an existing HTML tag w/ a new one) 所说的进行操作。

这应该将 pre 标签转换为 div 标签,但它会给出“ fatal error :未捕获的异常‘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();
?>

最佳答案

问题是对 replaceChild() 的调用。而不是

$dom->replaceChild($nodeDiv, $nodePre);

使用

$nodePre->parentNode->replaceChild($nodeDiv, $nodePre);

更新

这是一个工作代码。替换多个节点似乎存在一些问题(此处有更多信息: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);
}

关于php - 用 DOMDocument 替换 HTML 中的标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12018747/

30 4 0