2011-01-26 44 views
9

Tôi đang cố gắng phân tích cú pháp tài liệu và nhận tất cả các thẻ hình ảnh và thay đổi nguồn cho một cái gì đó khác.php DomDocument thêm thẻ phụ

 

    $domDocument = new DOMDocument(); 

    $domDocument->loadHTML($text); 

    $imageNodeList = $domDocument->getElementsByTagName('img'); 

    foreach ($imageNodeList as $Image) { 
     $Image->setAttribute('src', 'lalala'); 
     $domDocument->saveHTML($Image); 
    } 

    $text = $domDocument->saveHTML(); 
 

Các $ text ban đầu trông như thế này:


<p>Hi, this is a test, here is an image<img src="http://mysite.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>

và đây là sản phẩm $ text:


<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>Hi, this is a test, here is an image<img src="lalala" width="68" height="95"> Because I like Beer!</p></body></html>

Tôi nhận được một loạt các thẻ phụ (html, cơ thể và nhận xét ở trên cùng) mà tôi không thực sự cần. Bất kỳ cách nào để thiết lập DOMDocument để tránh thêm các thẻ phụ này?

Cảm ơn bạn!

Trả lời

5

DomDocument không may bị chậm phát triển và sẽ không cho phép bạn thực hiện việc này. Hãy thử điều này:

$text = preg_replace('/^<!DOCTYPE.+?>/', '', str_replace(array('<html>', '</html>', '<body>', '</body>'), array('', '', '', ''), $domDocument->saveHTML())); 
+1

cần đọc: $ text = preg_replace ('/^ /', '', str_replace (mảng ('', '', '', ''), mảng ('', '', ' ',' '), $ domDocument-> saveHTML())); –

+0

'preg_replace', thực sự? – sglessard

-1

Nếu bạn định lưu dưới dạng HTML, bạn phải mong đợi một tài liệu HTML hợp lệ được tạo!

Có một tùy chọn: DOMDocument::saveXML có một tham số tùy chọn cho phép bạn truy cập vào nội dung XML của một yếu tố đặc biệt:

$el = $domDocument->getElementsByTagName('p')->item(0); 
$text = $domDocument->saveXML($el); 

này giả định rằng nội dung của bạn chỉ có một p phần tử.

+0

tùy thuộc vào các yếu tố được sử dụng trong các tài liệu đó không phải luôn luôn là một ý tưởng tốt để sử dụng saveXML() để lấy một HTML nguồn . XML được tạo ra sẽ sử dụng viết tắt của tất cả các phần tử không có nội dung, điều này sẽ làm hỏng tài liệu HTML (ví dụ: '

10

Bạn chỉ cần thêm 2 cờ vào phương thức loadHTML(): LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD. I E.

$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD); 

Xem IDEONE demo:

$text = '<p>Hi, this is a test, here is an image<img src="http://example.com/beer.jpg" width="60" height="95" /> Because I like Beer!</p>'; 
$domDocument = new DOMDocument; 
$domDocument->loadHTML($text, LIBXML_HTML_NOIMPLIED|LIBXML_HTML_NODEFDTD); 
$imageNodeList = $domDocument->getElementsByTagName('img'); 

foreach ($imageNodeList as $Image) { 
     $Image->setAttribute('src', 'lalala'); 
     $domDocument->saveHTML($Image); 
} 

$text = $domDocument->saveHTML(); 
echo $text; 

Output:

<p>Hi, this is a test, here is an image<img src="lalala" width="60" height="95"> Because I like Beer!</p> 
+2

Điều này làm việc, nên là câu trả lời tốt nhất. Cảm ơn. – Lynnais

+0

Đối với tôi, chỉ cần tách tất cả html ra khỏi đó. Các đoạn văn của tôi cũng biến mất. – Mike

+0

@Mike: Điều đó là không thể vì mã không xóa bất kỳ thứ gì. Có lẽ HTML bạn có không hoàn toàn hợp lệ. Hãy thử thêm 'libxml_use_internal_errors (true);' trước khi khởi tạo DOMDocument với '$ domDocument = new DOMDocument;'. –

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