補充 xafford 的評論。當使用 ->item() 或 foreach 迭代 named node map 集合時,使用 DOMNode->removeAttribute() 或 DOMNode->removeAttributeNode() 移除屬性會改變集合,就像它是堆疊一樣。 舉例來說,以下程式碼嘗試從每個元素中移除所有屬性,但只移除第一個。 一個解決方法是在移除屬性之前將 named node map 複製到陣列中。 在 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: 已移除屬性 `$name`<br>";
}
// 從 p 元素移除屬性
$p = $doc->getElementsByTagName('p')->item(0);
foreach ($p->attributes as $name => $attrNode) {
$p->removeAttribute($name);
echo "p: 已移除屬性 `$name`<br>";
}
?>
輸出
-------
h1: 已移除屬性 `id`
注意:在 nodemap.php 的第 13 行嘗試取得非物件的屬性
h1: 已移除屬性 ``
p: 已移除屬性 `align`