mosesfender
@mosesfender
Меланхолик, параноик, падал с коек

Удаление атрибута узла. Почему не удаляется один из атрибутов?

Доброго времени.

Не очень силён в PHP, потому не совсем пойму в чём шило.

Беру все подряд узлы документа, и просто вычищаю в цикле все их атрибуты.

/* @var $tag \DOMElement */
            for ($i = 0; $i < $tag->attributes->length; $i++) {
                $tag->removeAttribute($tag->attributes[$i]->name);
            }


Удаляются все, в частности есть там атрибуты "class", "align" и всякая стандартная ерунда. Но кто-то умный додумался до атрибута "lang". $tag->attributes->length говорит о том, что он его видит, но на выхлопе атрибут остаётся неудалённым.

В чём может быть шило? То что атрибут не очень соответствует спецификации W3C для HTMLDivElement - это я понимаю.

==========================================

UPD. Одним словом, выяснилось, что по каким-то причинам некоторые атрибуты в цикле при удалении игнорируются, причём ни ошибок, ни нотисов. Да, это актуально и для DOMElement::removeAttribute() и для DOMElement::removeAttributeNode(). Пришлось пойти кружным путём, получить их имена, потом по именам удалять.
$removeAttributes = function(&$tag) {
            /* @var $tag \DOMElement */
            $attrs = [];
            /* Пришлось сначала получить имена аттрибутов */
            foreach ($tag->attributes as $idx => $attr) {
                $attrs[$idx]["name"] = $attr->name;
            }
            /* Затем удалять по именам */
            array_walk($attrs,
                    function($attr, $idx)use(&$tag, &$attrs) {
                $attrs[$idx]["removed"] = $tag->removeAttribute($attr["name"]);
            });
            return $attrs;
        };
  • Вопрос задан
  • 74 просмотра
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы