2011-01-28 13 views
7

Estoy tratando de cambiar todas las etiquetas <P> en un documento al <DIV>. Esto es lo que he llegado con, pero no parece funcionar:PHP - DOMDocument - necesito cambiar/reemplazar una etiqueta HTML existente con una nueva

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

Este es el resultado que quiero:

Antes:

<p>Some text here</p> 

Después:

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

Esto funciona http://stackoverflow.com/a/21885789/175071 –

Respuesta

9

Usted está agregando el div al p que resulta en <p><div></div></p>, eliminar el p eliminará todo.
Además, $divnode->createElement() no funcionará cuando $divnode no se haya inicializado.

Intente utilizar el DOMDocument::replaceChild() (la posición de div en el dom será la misma que la p s).

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

** Una nota: si ** '$ pnode-> nodeValue' no es un texto sin formato, pero tiene nodos adicionales, solo se dejará el texto (html se quitará). –

+0

No puede simplemente reemplazar elementos mientras itera ya que el índice cambia y termina con resultados extraños. – Sanne

+2

adivinen qué: de hecho lo probé en el momento en que lo respondí. Entonces, en caso de que use una versión reciente de PHP, foreach puede manejar la manipulación del índice. –

0

función mejorada de 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; 
} 
Cuestiones relacionadas