Благодаря вашему посту я смог быстро решить ту же проблему для меня. Однако у меня было исключение DOM_NOT_FOUND. Вероятно, это проблема версии PHP, поскольку исходному посту 5 лет.
Согласно документации PHP (февраль 2014 г.)
DOM_NOT_FOUND
Raised if oldnode is not a child of this node.
Итак, я заменил
$newnode->ownerDocument->replaceChild($newnode, $node);
с
$node->parentNode->replaceChild($newnode, $node);
Вот полная функция (проверено):
public static function changeTagName($node, $name) {
$childnodes = array();
foreach ($node->childNodes as $child){
$childnodes[] = $child;
}
$newnode = $node->ownerDocument->createElement($name);
foreach ($childnodes as $child){
$child2 = $node->ownerDocument->importNode($child, true);
$newnode->appendChild($child2);
}
foreach ($node->attributes as $attrName => $attrNode) {
$attrName = $attrNode->nodeName;
$attrValue = $attrNode->nodeValue;
$newnode->setAttribute($attrName, $attrValue);
}
$node->parentNode->replaceChild($newnode, $node);
return $newnode;
}
Стоит также упомянуть, что, когда вы хотите использовать эту функцию, вы должны проходить Дерево DOM в обратном порядке, как объяснено в других публикациях.
ОБНОВЛЕНИЕ: После нескольких месяцев использования и обновления до версии PHP 5.5.15 в Windows у меня была ошибка, что $ attr не удалось преобразовать в строку. Так что я обновил третий цикл для каждого выше.