2010-07-07 17 views
16

Ho un oggetto DOM con markup HTML caricato. Sto cercando di sostituire tutti incorporare tag che assomigliano a questo:PHP DOM sostituisce l'elemento con un nuovo elemento

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

Con un tag come questo:

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

sto avendo problemi di capire tutto questo e non voglio usare espressione regolare per questo. Puoi aiutarmi?

EDIT:

Questo è quello che ho finora:

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

non hanno tempo di scrivere una risposta in questo momento, ma guarda che http://www.php.net/manual/en/class.domdocument.php –

+0

Ho guardato ma non riesco a capirlo. Ho aggiornato la mia risposta con il codice che ho già ma l'ultima riga che dovrebbe cambiare elementi non funziona. –

+0

Vedi domanda simile: http://stackoverflow.com/q/17864378 –

risposta

29

E 'facile trovare elementi da un DOM utilizzando getElementsByTagName. In effetti non vorresti avvicinarti alle espressioni regolari per questo.

Se il DOM si sta parlando è un PHP DOMDocument, devi fare qualcosa di simile:

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

Edit re edit:

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

Sì, replaceChild prende il nuovo elemento da sostituire -con come il primo argomento e il bambino da sostituire come il secondo. Questo non è il modo in cui ci si potrebbe aspettare, ma è coerente con tutti gli altri metodi DOM. Inoltre è un metodo del nodo genitore del bambino da sostituire.

(io ho usato class non id, come non si può avere più elementi sulla stessa pagina tutti chiamati id="player".)

+0

Grazie, lo saprò la prossima volta :) –

Problemi correlati