2010-02-27 38 views
16

Tôi đang sử dụng DOMDocument của PHP để phân tích và bình thường hóa HTML người dùng gửi bằng cách sử dụng phương pháp loadHTML để phân tích các nội dung sau đó nhận được một kết quả tốt được hình thành qua saveHTML:PHP DOMDocument - nhận nguồn html của BODY

$dom= new DOMDocument(); 
$dom->loadHTML('<div><p>Hello World'); 
$well_formed= $dom->saveHTML(); 
echo($well_formed); 

Điều này thực hiện một công việc tuyệt vời để phân tích cú pháp phân đoạn và thêm các thẻ đóng thích hợp. Vấn đề là tôi cũng nhận được một loạt các thẻ tôi không muốn như <!DOCTYPE>, <html>, <head><body>. Tôi hiểu rằng mọi tài liệu HTML được định dạng tốt đều cần các thẻ này, nhưng đoạn HTML mà tôi đang chuẩn hóa sẽ được chèn vào một tài liệu hợp lệ hiện có.

Trả lời

3

Trong trường hợp của bạn, bạn không muốn làm việc với tài liệu HTML, nhưng với một đoạn HTML - một phần của mã HTML ;; có nghĩa là DOMDocument không hoàn toàn là những gì bạn cần.

Thay vào đó, tôi thà sử dụng một cái gì đó giống như HTMLPurifier(trích dẫn):

HTML Purifier là một thư viện bộ lọc HTML tiêu chuẩn tương thích viết bằng PHP. HTML Purifier sẽ không chỉ loại bỏ tất cả mã độc hại (thường được gọi là XSS) với một kiểm toán kỹ lưỡng, đảm bảo chưa whitelist dễ dãi, nó cũng sẽ chắc chắn rằng tài liệu của bạn là tiêu chuẩn phù hợp, một cái gì đó chỉ thể đạt được với một toàn diện kiến ​​thức về thông số kỹ thuật của W3C.

Và, nếu bạn cố gắng phần code của bạn:

<div><p>Hello World 

Sử dụng the demo page of HTMLPurifier, bạn sẽ có được HTML sạch này như một đầu ra:

<div><p>Hello World</p></div> 

Tốt hơn nhiều, phải không? ;-)

(Lưu ý rằng HTMLPurfier suppots một loạt các tùy chọn, và rằng việc xem xét tài liệu của nó có thể không làm tổn thương)

+5

Có thông tin tốt ở đây, nhưng tôi muốn lập luận rằng DOMDocument vẫn là một legit công cụ này. Sự tồn tại của một phương thức "loadHTML" ngụ ý rằng DOMDocument có nghĩa là để phân tích các tài liệu HTML cũng như các tài liệu XML. HTMLPurifier hoặc các trình phân tích cú pháp HTML "true" khác được viết bằng PHP rất tuyệt vời, nhưng sự hoàn hảo của chúng. luôn nhạt nhòa khi so sánh với PHP Objects. –

+0

@Alan: Tôi đồng ý rằng DOMDocument là tuyệt vời khi nói đến phân tích cú pháp tài liệu HTML ;;; nhưng đối với các phần HTML, đặc biệt là ** do người dùng gửi **, tôi tin HTMLPurifier là một công cụ tốt hơn: nó được tạo chính xác với mục đích lọc HTML do người dùng gửi - bao gồm từ điểm bảo mật * (Ví dụ: DOMDocument không quan tâm đến XSS, trong khi HTMLPurifier không ;;; DOMDocument không cho phép bạn chỉ định thẻ/thuộc tính nào được cho phép, trong khi HTMLPUrifier thực hiện) * –

22

Các giải pháp nhanh chóng cho vấn đề của bạn là sử dụng một biểu thức XPath để lấy cơ thể.

$dom= new DOMDocument(); 
$dom->loadHTML('<div><p>Hello World');  
$xpath = new DOMXPath($dom); 
$body = $xpath->query('/html/body'); 
echo($dom->saveXml($body->item(0))); 

Cảnh báo ở đây. Đôi khi loadHTML sẽ ném một cảnh báo khi nó gặp phải các tài liệu HTML được định dạng kém. Nếu bạn đang phân tích cú pháp các loại tài liệu HTML đó, bạn sẽ cần tìm một cảnh báo tự liên kết better html parser.

+3

điều này sẽ trả về [CONTENT] ... bạn có thể nhận được như thế nào chỉ [CONTENT]? – farinspace

+1

bạn luôn có thể thực hiện tìm kiếm và thay thế trước khi xuất ... – farinspace

1

Đối mặt với cùng một vấn đề, tôi đã tạo một trình bao bọc quanh DOMDocument được gọi là SmartDOMDocument để khắc phục điều này và một số thiếu sót khác (chẳng hạn như sự cố mã hóa).

Bạn có thể tìm thấy nó ở đây: http://beerpla.net/projects/smartdomdocument

0

này được lấy từ bài khác và làm việc một cách hoàn hảo để sử dụng của tôi:

$layout = preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', $layout); 
+0

có liên quan: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags –

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