Php 从DomeElement中删除属性仅在向后迭代时有效

Php 从DomeElement中删除属性仅在向后迭代时有效,php,attributes,domdocument,Php,Attributes,Domdocument,背景信息:我使用Ubuntu13.04存储库中的PHP5.4.9。我的代码的目的是递归地迭代HTML源代码(作为一个函数),并清除所有在Epub文件中使用无效的内容(即,和属性对齐对Epubs中的段落无效) 输入示例: <p lang="de" class="foo" style="align: left;">... some content ...</p>

背景信息:我使用Ubuntu13.04存储库中的PHP5.4.9。我的代码的目的是递归地迭代HTML源代码(作为一个函数),并清除所有在Epub文件中使用无效的内容(即,和属性对齐对Epubs中的段落无效)

输入示例:

<p lang="de" class="foo" style="align: left;">... some content ...</p>

期望输出:

<p class="foo">... some content ...</p>

。。。一些内容


1:今天我尝试使用以下简单代码从中删除属性:

<?php
for ( $k=0; $k < $element->attributes->length; $k++) {
    if( /* some rule */ ){
        var_dump( $element->attributes->item($k)->nodeName);
        $element->removeAttributeNode( $element->attributes->item($k));
    }
}
?>

不幸的是,当这个循环完成时,所有属性仍然存在,即使这些var_转储告诉我尝试删除它们

我解决了向后迭代属性列表的问题:

<?php
for ( $k = $element->attributes->length - 1; $k >= 0; --$k) {
    if( /* same rule */ ){
        var_dump( $element->attributes->item($k)->nodeName);
        $element->removeAttributeNode( $element->attributes->item($k));
    }
}
?>

问:你知道为什么它只在向后迭代时才起作用吗


2:不返回bool,而是返回DOMAttr对象

问:这是php.net手册中的一个错误,还是我在做/理解一些错误的事情


它现在起作用了,但如果能知道它为什么只起作用,那就太好了。
在advanced中感谢您

我不知道为什么属性没有被删除,但在修改容器时迭代容器通常不是一个好主意。我已经尝试了您之前提到的方法,并获得了相同的结果。因此,在第一步中,保存所有需要删除的属性。然后在第二步,在第一次迭代完成后,我尝试删除这些属性。之后它们仍然存在。从后面到前面也可以。虽然这并不能真正解释你的问题,但这是正确的做法™ 从数组中删除内容时。