补充 xafford 的评论。当使用 ->item() 或使用 foreach 迭代命名节点映射集合时,使用 DOMNode->removeAttribute() 或 DOMNode->removeAttributeNode() 删除属性会像堆栈一样改变集合。为了说明,下面的代码试图从每个元素中删除所有属性,但只删除了第一个。一种解决方法是在删除属性之前将命名节点映射复制到数组中。使用 Windows XP 上的 PHP 5.2.9。
<?php
error_reporting(E_ALL);
$html = '<h1 id="h1test" class="h1test">Heading</h1>';
$html .= '<p align="left" class="ptest">Hello World</p>';
$doc = new DOMDocument();
$doc->loadHTML($html);
// 从 h1 元素中删除属性
$h1 = $doc->getElementsByTagName('h1')->item(0);
$length = $h1->attributes->length;
for ($i = 0; $i < $length; ++$i) {
$name = $h1->attributes->item($i)->name;
$h1->removeAttribute($name);
echo "h1: removed attribute `$name`<br>";
}
// 从 p 元素中删除属性
$p = $doc->getElementsByTagName('p')->item(0);
foreach ($p->attributes as $name => $attrNode) {
$p->removeAttribute($name);
echo "p: removed attribute `$name`<br>";
}
?>
输出
-------
h1: removed attribute `id`
Notice: Trying to get property of non-object in nodemap.php on line 13
h1: removed attribute ``
p: removed attribute `align`