Wrap DOM-Element in einem anderen DOM-Element in PHP

Ich habe ursprünglich eine Frage in diesem Sinne mit Regex gestellt, aber es wurde empfohlen, stattdessen die PHP-DOM-Bibliothek zu verwenden ... das ist überlegen, aber ich stecke immer noch fest.

rundsätzlich möchte ich den Inhalt eines<a> in einem<span> wenn es noch nicht in @ eingeschlossen i<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; 
} 

It liefert diese Ausgabe:

PHP Warnung: DOMDocumentFragment :: appendXML (): Entität: Zeile 1: Parser-Fehler: Vorzeitiges Datenende im Tag img Zeile 1 in / private / var / folders / 78 / 78vHGigZHcuFeXB1KKJSb ++++ TI / -Tmp- / untitled_3xd ..php on line 24
PHP Warnung: DOMDocumentFragment :: appendXML (): Bildlink in /private/var/folders/78/78vHGigZHcuFeXB1KKJSb+++TI/-Tmp-/untitled_3xd..php in Zeile 24 PHP Warnung: DOMDocumentFragment :: appendXML () : ^ in /private/var/folders/78/78vHGigZHcuFeXB1KKJSb+++TI/-Tmp-/untitled_3xd..php in Zeile 24 PHP Warnung: DOMNode :: appendChild (): Dokumentfragment ist leer in / private / var / folders / 78 / 78vHGigZHcuFeXB1KKJSb ++++ TI / -Tmp- / untitled_3xd..php in Zeile 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>

Dies funktioniert meistens, außer dass es wirklich wählerisch ist und wie Sie sehen, stirbt es, wenn hier ein @ iimg (oder ähnliches) Tag ima href.

Was ist der beste Weg, um diese Arbeit zu machen. Ich habe jetzt schon lange meinen Kopf gegen eine peinliche Zeit geschlagen.

BEARBEITE

Basierend auf dem unten stehenden Feedback finden Sie hier den überarbeiteten Code und die Ausgabe. Beachten Sie, dass der Text vor demimg tag wird aus irgendeinem Grund nicht umgebrochen. Irgendwelche Ideen

$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();

Ausgabe

<!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>

Antworten auf die Frage(4)

Ihre Antwort auf die Frage