2010-07-07 21 views
16

Yüklü HTML işaretlemesi olan bir DOM nesnesine sahibim. Böyle bir etiketi ilePHP DOM öğeyi yeni bir öğeyle değiştir

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

: Ben şuna benzer Tüm gömme etiketleri değiştirmek çalışıyorum

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

bu endam sorun yaşıyorum ve ben kullanmak istemiyorum Bunun için düzenli ifade. Bana yardım edebilir misin?

DÜZENLEME: getElementsByTagName kullanarak bir DOM unsurları bulmak kolaydır

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

şu anda bir cevap yazmak için zaman var, ancak kontrol etme http://www.php.net/manual/en/class.domdocument.php –

+0

Baktım ama anlayamıyorum. Cevabımı halihazırda sahip olduğum kodla güncelledim ama eleman değiştirmesi gereken son satır çalışmıyor. –

+0

Benzer bir soruya bakın: http://stackoverflow.com/q/17864378 –

cevap

29

:

Bu defa ne var. Gerçekten bunun için düzenli ifadelere yaklaşmak istemezsiniz.

bahsediyorsun DOM, sen böyle bir şey yapmak istiyorum bir PHP DOMDocument ise

:

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

Düzenleme yeniden düzenleme:

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

Evet, replaceChild yerine yeni eleman alır -İlk argüman ve ikinci olarak değiştirilecek çocuk olarak. Beklediğiniz yol bu değil, diğer tüm DOM yöntemleriyle tutarlı. Ayrıca, değiştirilecek çocuğun ana düğümünün bir yöntemidir.

(aynı sayfada tüm denilen id="player" birden çok öğeyi olamaz gibi ben değil idclass kullandı.)

+0

Teşekkür ederim, bir dahaki sefere bileceğim :) –

İlgili konular