2010-07-07 46 views
16

Tôi có đối tượng DOM có đánh dấu HTML được tải. Tôi đang cố gắng để thay thế tất cả các thẻ nhúng mà trông như thế này:PHP DOM thay thế phần tử bằng phần tử mới

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

Với một thẻ như thế này:

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

Tôi đang gặp rắc rối figuring this out và tôi không muốn sử dụng biểu thức chính quy cho điều này. Ông có thể giúp tôi không?

EDIT:

Đây là những gì tôi có cho đến nay:

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

Không có thời gian để viết lên một câu trả lời ngay bây giờ, nhưng hãy kiểm tra http://www.php.net/manual/en/class.domdocument.php –

+0

Tôi đã xem nhưng tôi không thể tìm ra. Tôi đã cập nhật câu trả lời của tôi với mã tôi đã có nhưng dòng cuối cùng được cho là để chuyển đổi các yếu tố không hoạt động. –

+0

Xem câu hỏi tương tự: http://stackoverflow.com/q/17864378 –

Trả lời

29

Thật dễ dàng để tìm các yếu tố từ một DOM sử dụng getElementsByTagName. Thật vậy, bạn sẽ không muốn đi gần biểu thức chính quy cho việc này.

Nếu DOM bạn đang nói về là một PHP DOMDocument, bạn muốn làm điều gì đó như:

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

Chỉnh sửa lại chỉnh sửa:

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

Yeah, replaceChild mất các yếu tố mới để thay thế - với tư cách là đối số đầu tiên và đứa trẻ được thay thế làm đối số thứ hai. Đây không phải là cách bạn có thể mong đợi, nhưng nó phù hợp với tất cả các phương thức DOM khác. Ngoài ra nó là một phương pháp của nút cha của đứa trẻ được thay thế.

(tôi đã sử dụng class không id, như bạn không thể có nhiều phần tử trên cùng một trang tất cả gọi id="player".)

+0

Cảm ơn bạn, tôi sẽ biết lần sau :) –

Các vấn đề liên quan