Ajustar elemento DOM en otro elemento DOM en PHP

Originalmente hice una pregunta a lo largo de estas líneas usando Regex, pero me recomendaron usar la biblioteca DOM de PHP en su lugar ... que es superior, pero todavía estoy atascado.

Básicamente, quiero envolver el contenido de un<a> en un<span> si aún no está envuelto en<span>.

<?php
$input = <<<EOT
<html><head></head>
<body bgcolor="#393a36">
    <a href="#"><span style="color:#ffffff;">Link 1</span></a>
    <a href="#">Link 2</a>
    <a href="#"><img src="mypic.gif" />Image Link</a>
    <a href="#"><u>Underlined Link</u></a>
</body>
</html>
EOT;


$doc = new DOMDocument();
$doc->loadHTML($input);
$tags = $doc->getElementsByTagName('a');
foreach ($tags as $tag) {
    $spancount = $tag->getElementsByTagName("span")->length;
    if($spancount == 0){
        $content = nodeContent($tag);
        $element = $doc->createElement('span');
        $element->setAttribute('style','color:#ffffff;');
        $frag = $doc->createDocumentFragment();
        $frag->appendXML($content);
        $element->appendChild($frag);   
        $tag->nodeValue = ""; //clear node
        $tag->appendChild($element);
    }
}
echo $doc->saveHTML();

function nodeContent($n, $outer=false) { 
    $d = new DOMDocument('1.0'); 
    $d->formatOutput = true;
    $b = $d->importNode($n->cloneNode(true),true); 
    $d->appendChild($b);
    $h = $d->saveHTML(); 
    // remove outter tags 
    if (!$outer) $h = substr($h,strpos($h,'>')+1,-(strlen($n->nodeName)+4)); 
    return $h; 
} 

Proporciona esta salida:

Advertencia de PHP: DOMDocumentFragment :: appendXML (): Entidad: línea 1: error del analizador: Fin prematuro de datos en la etiqueta img línea 1 en / private / var / folder / 78 / 78vHGigZHcuFeXB1KKJSb ++++ TI / -Tmp- / untitled_3xd. .php en la línea 24
Advertencia de PHP: DOMDocumentFragment :: appendXML (): Enlace de imagen en /private/var/folders/78/78vHGigZHcuFeXB1KKJSb++++TI/-Tmp-/untitled_3xd..php en línea 24 Advertencia de PHP: DOMDocumentFragment :: appendXML (): ^ en /private/var/folders/78/78vHGigZHcuFeXB1KKJSb++++TI/-Tmp-/untitled_3xd..php en la línea 24 Advertencia PHP: DOMNode :: appendChild (): el fragmento de documento está vacío en / private / var / carpetas /78/78vHGigZHcuFeXB1KKJSb++++TI/-Tmp-/untitled_3xd..php en la línea 25

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>  
<head></head>  
<body bgcolor="#393a36">  
    <a href="#"><span style="color:#ffffff;">Link 1</span></a>  
    <a href="#"><span style="color:#ffffff;">Link 2</span></a>  
    <a href="#"><span style="color:#ffffff;"></span></a>  
    <a href="#"><span style="color:#ffffff;"><u>Underlined Link</u></span></a>  
</body>  
</html>

Esto funciona principalmente, excepto que es realmente exigente, y como puede ver, muere si aquí hay unimg (o similar) dentro de la etiquetaa href.

¿Cuál es la mejor manera de hacer que esto funcione? He estado golpeándome la cabeza desde hace mucho tiempo vergonzoso.

EDITAR

Según los comentarios a continuación, aquí está el código revisado y la salida. Tenga en cuenta que el texto que precede alimg la etiqueta no se está envolviendo por alguna razón. ¿Algunas ideas?

$doc = new DOMDocument();
$doc->loadHTML($input);
$tags = $doc->getElementsByTagName('a');
foreach ($tags as $tag) {
    $spancount = $tag->getElementsByTagName("span")->length;
    if($spancount == 0){
    $element = $doc->createElement('span');
    $element->setAttribute('style','color:#ffffff;');
    foreach ($tag->childNodes as $child) {
        $tag->removeChild($child);
        $element->appendChild($child);
    }
    $tag->appendChild($element);

    }
}
echo $doc->saveHTML();

Salida:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head></head>
<body bgcolor="#393a36">
    <a href="#"><span style="color:#ffffff;">Link 1</span></a>
    <a href="#"><span style="color:#ffffff;">Link 2</span></a>
    <a href="#">Image Link<span style="color:#ffffff;"><img src="mypic.gif"></span></a>
    <a href="#"><span style="color:#ffffff;"><u>Underlined Link</u></span></a>
</body>
</html>

Respuestas a la pregunta(2)

Su respuesta a la pregunta