2010-07-07 9 views
16

Tengo un objeto DOM con etiquetas HTML cargadas. Estoy tratando de reemplazar todas las etiquetas embed que se ven así:PHP DOM elemento de reemplazo con un nuevo elemento

<embed allowfullscreen="true" height="200" src="path/to/video/1.flv" width="320"></embed> 

Con una etiqueta como esta:

<a 
href="path/to/video/1.flv" 
style="display:block;width:320px;height:200px;" 
id="player"> 
</a> 

estoy teniendo problemas calcular esto y yo no quiero usar expresión regular para esto. ¿Podrías ayudarme?

EDIT:

Esto es lo que tengo hasta ahora:

  // DOM initialized above, not important 
      foreach ($dom->getElementsByTagName('embed') as $e) { 
       $path = $e->getAttribute('src'); 
      $width = $e->getAttribute('width') . 'px'; 
      $height = $e->getAttribute('height') . 'px'; 
      $a = $dom->createElement('a', ''); 
      $a->setAttribute('href', $path); 
      $a->setAttribute('style', "display:block;width:$width;height:$height;"); 
      $a->setAttribute('id', 'player'); 
      $dom->replaceChild($e, $a); // this line doesn't work 
     } 
+0

no tiene tiempo para escribir una respuesta ahora, pero echa un vistazo a http://www.php.net/manual/en/class.domdocument.php –

+0

Lo he buscado pero no lo puedo descifrar. He actualizado mi respuesta con el código que ya tengo, pero la última línea, que se supone que debe cambiar los elementos, no funciona. –

+0

Ver pregunta similar: http://stackoverflow.com/q/17864378 –

Respuesta

29

Es fácil de encontrar elementos de un DOM utilizando getElementsByTagName. De hecho, no querrás acercarte a expresiones regulares para esto.

Si el DOM que está hablando es un PHP DOMDocument, que haría algo como:

$embeds= $document->getElementsByTagName('embed'); 
foreach ($embeds as $embed) { 
    $src= $embed->getAttribute('src'); 
    $width= $embed->getAttribute('width'); 
    $height= $embed->getAttribute('height'); 

    $link= $document->createElement('a'); 
    $link->setAttribute('class', 'player'); 
    $link->setAttribute('href', $src); 
    $link->setAttribute('style', "display: block; width: {$width}px; height: {$height}px;"); 

    $embed->parentNode->replaceChild($link, $embed); 
} 

Editar re edición:

$dom->replaceChild($e, $a); // this line doesn't work 

Sí, replaceChild toma el nuevo elemento para reemplazar -con como el primer argumento y el niño a ser-reemplazado como el segundo. Este no es el camino que podría esperar, pero es consistente con todos los demás métodos DOM. También es un método del nodo padre del niño que se reemplazará.

(I utilizado class no id, ya que no puede tener múltiples elementos en la misma página todo llamado id="player".)

+0

Gracias, lo sabré la próxima vez :) –

Cuestiones relacionadas