2011-01-28 9 views
7

Sto tentando di modificare tutti i tag <P> in un documento su <DIV>. Questo è ciò che mi è venuta in mente, ma non sembra funzionare:PHP - DOMDocument - necessità di modificare/sostituire un tag HTML esistente con uno nuovo

$dom = new DOMDocument; 
$dom->loadHTML($htmlfile_data); 

foreach($dom->getElementsByTagName("p") as $pnode) { 
    $divnode->createElement("div"); 
    $divnode->nodeValue = $pnode->nodeValue; 
    $pnode->appendChild($divnode); 
    $pnode->parentNode->removeChild($pnode); 
} 

Questo è il risultato che voglio:

Prima:

<p>Some text here</p> 

Dopo:

<div>Some text here</div> 
+0

Questo funziona http://stackoverflow.com/a/21885789/175071 –

risposta

9

Stai aggiungendo il div al tuo p che risulta in <p><div></div></p>, rimuovendo lo p verrà rimosso tutto.
Inoltre $divnode->createElement() non funziona quando $divnode non è inizializzato.

Provare invece a utilizzare DOMDocument::replaceChild() (la posizione div in dom sarà la stessa di p s).

foreach($dom->getElementsByTagName("p") as $pnode) { 
    $divnode = $dom->createElement("div", $pnode->nodeValue); 
    $dom->replaceChild($divnode, $pnode); 
} 
+1

** Una nota: ** se '$ pnode-> nodeValue' non è un testo semplice, ma contiene nodi aggiuntivi, verrà lasciato solo il testo (html verrà rimosso). –

+0

Non è possibile sostituire gli articoli durante l'iterazione poiché l'indice cambia e si ottengono risultati strani. – Sanne

+2

indovina un po ': l'ho effettivamente testato nel momento in cui ho risposto. Quindi, nel caso in cui si utilizzi una versione di foreach recente, foreach può gestire la manipolazione dell'indice. –

0

funzione avanzata da this answer

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); 
    } 
    if ($node->hasAttributes()) { 
     foreach ($node->attributes as $attr) { 
      $attrName = $attr->nodeName; 
      $attrValue = $attr->nodeValue; 
      $newnode->setAttribute($attrName, $attrValue); 
     } 
    } 
    $node->parentNode->replaceChild($newnode, $node); 
    return $newnode; 
} 
Problemi correlati