背景情報: Ubuntu 13.04 リポジトリの PHP5.4.9 を使用しています。私のコードの目的は、HTML ソースを ( DomDocumentとして) 再帰的に反復し、Epub ファイル内で使用するのに有効でないすべてのものをクリーンアップすることです (つまり、属性 align は Epub の段落では有効ではありません)。
入力例:
<p lang="de" class="foo" style="align: left;">... some content ...</p>
望ましい出力:
<p class="foo">... some content ...</p>
1 : 今日、この単純なコードを使用してDOMElementから属性を削除しようとしました:
<?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_dumps がそれらを削除しようとしたことを私に伝えたとしても、このループが終了したとき、すべての属性がまだ存在していました。
属性リストを逆方向に繰り返してこの問題を解決しました。
<?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 : DOMElement::removeAttributeNodeは bool ではなく DOMAttr オブジェクトを返します。
質問: これは php.net マニュアルのエラーですか、それとも何か間違ったことをしている/理解していませんか?
今のところ機能しますが、なぜこのようにしか機能しないのかを知ることは素晴らしいことです. よろしくお願いします