Доброго времени.
Не очень силён в 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;
};