2009-04-20 40 views
27

Tôi đang sử dụng phần mở rộng DOM trong PHP để xây dựng một số tài liệu HTML và tôi muốn đầu ra được định dạng độc đáo (với các dòng mới và thụt lề) để có thể đọc được , từ nhiều bài kiểm tra tôi đã thực hiện:PHP "in đẹp" HTML (không gọn gàng)

  1. "formatOutput = true" không làm việc ở tất cả với saveHTML(), chỉ saveXML()
  2. Thậm chí nếu tôi sử dụng saveXML(), nó vẫn chỉ hoạt động trên các phần tử được tạo thông qua DOM, không phải các phần tử được bao gồm với loadHTML(), ngay cả với "preserveWhiteSpace = false"

Nếu có ai biết khác, tôi thực sự muốn biết họ đã làm việc như thế nào.

Vì vậy, tôi có tài liệu DOM và tôi đang sử dụng saveHTML() để xuất HTML. Vì nó đến từ DOM tôi biết nó là hợp lệ, không cần phải "Tidy" hoặc xác nhận nó theo bất kỳ cách nào.

Tôi chỉ đang tìm cách để có được kết quả được định dạng độc đáo từ đầu ra tôi nhận được từ phần mở rộng DOM.

NB. Như bạn có thể đoán, tôi không muốn sử dụng phần mở rộng Tidy dưới dạng a) nó cũng cần nhiều hơn nữa (đánh dấu đã hợp lệ) và b) nó thực sự thay đổi nội dung HTML (chẳng hạn như tài liệu HTML 5 và một số phần tử).

Follow Up:

OK, với sự giúp đỡ của các câu trả lời dưới đây tôi đã làm việc ra lý do tại sao phần mở rộng DOM đã không làm việc. Mặc dù ví dụ cụ thể hoạt động, nhưng nó vẫn không hoạt động với mã của tôi. Với sự giúp đỡ của this bình luận Tôi thấy rằng nếu bạn có bất kỳ nút văn bản nào mà isWhitespaceInElementContent() là đúng thì không có định dạng nào được áp dụng ngoài điểm đó. Điều này xảy ra bất kể có hay không bảo vệWhiteSpace là sai. Giải pháp là để loại bỏ tất cả các nút (mặc dù tôi không chắc chắn nếu điều này có thể có tác dụng phụ trên nội dung thực tế).

Trả lời

29

bạn nói đúng, dường như không có sự thụt đầu dòng cho HTML (others are also confused). XML hoạt động, ngay cả với mã được nạp.

<?php 
function tidyHTML($buffer) { 
    // load our document into a DOM object 
    $dom = new DOMDocument(); 
    // we want nice output 
    $dom->preserveWhiteSpace = false; 
    $dom->loadHTML($buffer); 
    $dom->formatOutput = true; 
    return($dom->saveHTML()); 
} 

// start output buffering, using our nice 
// callback function to format the output. 
ob_start("tidyHTML"); 

?> 
<html> 
    <head> 
    <title>foo bar</title><meta name="bar" value="foo"><body><h1>bar foo</h1><p>It's like comparing apples to oranges.</p></body></html> 
<?php 
// this will be called implicitly, but we'll 
// call it manually to illustrate the point. 
ob_end_flush(); 
?> 

kết quả:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
<head> 
<title>foo bar</title> 
<meta name="bar" value="foo"> 
</head> 
<body> 
<h1>bar foo</h1> 
<p>It's like comparing apples to oranges.</p> 
</body> 
</html> 

cùng với saveXML() ...

<?xml version="1.0" standalone="yes"?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html> 
    <head> 
    <title>foo bar</title> 
    <meta name="bar" value="foo"/> 
    </head> 
    <body> 
    <h1>bar foo</h1> 
    <p>It's like comparing apples to oranges.</p> 
    </body> 
</html> 

lẽ quên để thiết lập preserveWhiteSpace = false trước loadHTML?

tuyên bố từ chối trách nhiệm: tôi đã lấy cắp hầu hết mã demo từ tyson clugg/php manual comments. lười biếng tôi.


UPDATE: bây giờ tôi nhớ cách đây vài năm tôi đã cố gắng điều tương tự và chạy vào cùng một vấn đề. i cố định điều này bằng cách áp dụng một cách giải quyết dơ bẩn (không phải là hiệu suất quan trọng): tôi chỉ bằng cách nào đó chuyển đổi xung quanh giữa SimpleXML và DOM cho đến khi vấn đề biến mất. tôi cho rằng việc chuyển đổi đã loại bỏ các nút đó.có thể tải với dom, nhập với simplexml_import_dom, sau đó xuất chuỗi, phân tích cú pháp này với DOM một lần nữa và sau đó in nó đẹp. theo như tôi nhớ điều này đã làm việc (nhưng nó là thực sự là chậm).

+0

Cảm ơn. Với các ví dụ của bạn và các ý kiến ​​trên php.net tôi đã làm việc ra vấn đề (xem tiếp theo ở trên). –

+0

Các giải pháp với DOM dường như với tôi khá nặng. Nhanh hay chậm? Bạn cũng nên sử dụng nó trên các đoạn trích nhỏ hơn hoặc chỉ trên toàn bộ trang? – sumid

+0

Có vấn đề trong khi sử dụng 'saveXML()' với một số thẻ không có giá trị như '' nó chuyển đổi nó thành '