2010-02-28 26 views
8

Trong mã của tôi, tôi chuyển đổi một số tài liệu xls được tạo kiểu sang html bằng cách sử dụng openoffice. Sau đó tôi phân tích các bảng bằng cách sử dụng xml_parser_create. Vấn đề là openoffice tạo html oldschool với các thẻ <BR><HR> không được đính kèm, nó không tạo ra các loại tài liệu và không trích dẫn thuộc tính <TABLE WIDTH=4>.Phân tích cú pháp HTML được định dạng sai trong PHP

Trình phân tích cú pháp php tôi biết không thích điều này và mang lại lỗi định dạng xml. Giải pháp hiện tại của tôi là chạy một số regex trên tệp trước khi tôi phân tích cú pháp, nhưng điều này không tốt đẹp cũng không nhanh.

Bạn có biết một trình phân tích cú pháp php (hy vọng), không quan tâm đến những loại lỗi này? Hoặc có lẽ một cách nhanh chóng để sửa một html 'bị hỏng'?

Trả lời

8

Một giải pháp để "sửa chữa" tấm HTML có thể được sử dụng 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ả các mã độc hại (thường được gọi là XSS) với một kiểm toán kỹ lưỡng, danh sách trắng nhưng dễ dãi an toàn, nó cũng sẽ đảm bảo tài liệu của bạn là tiêu chuẩn phù hợp


Một ý tưởng thay thế có thể là để thử tải HTML của bạn với DOMDocument::loadHTML(trích dẫn):

Hàm phân tích HTML chứa trong nguồn chuỗi. Không giống như tải XML, HTML không phải là cũng được hình thành để tải.

Và nếu bạn đang cố tải HTML từ tệp, hãy xem DOMDocument::loadHTMLFile.

+0

+1 để giới thiệu htmlpurifier. người ta cũng có thể xem http://simplehtmldom.sourceforge.net/. – Alexar

+0

Máy lọc rất đẹp, nhưng cảm giác như hơi quá mức cho vấn đề. Điều tương tự cũng xảy ra với DOMParser. Nó không chính xác, rằng nó sẽ đòi hỏi rất nhiều thời gian và ram hơn một phân tích cú pháp sax đơn giản? –

+0

Có thể nó sẽ đòi hỏi nhiều RAM hơn, và có thể là thời gian; nhưng nó sẽ làm nhiều hơn một phân tích cú pháp SAX đơn giản, mà sẽ chỉ đọc dữ liệu, và không sửa chữa nó ;;; và tôi muốn nói một trình phân tích cú pháp SAX sẽ chỉ có thể đọc XML hợp lệ - trong khi HTMLPurifier và 'DOMDocument :: loadHTML' đều có thể đọc được HTML" bị hỏng ". –

4

SimpleHTML

Đối với sửa chữa HTML bị hỏng, bạn có thể sử dụng Tidy.

Thay vào đó, bạn có thể sử dụng số gốc XML Reader. Bởi vì nó hoạt động như một con trỏ tiến lên trên luồng tài liệu và dừng ở mỗi nút trên đường, nó sẽ không phá vỡ các tài liệu XML không hợp lệ.

Xem http://www.ibm.com/developerworks/library/x-pullparsingphp.html

+1

+1 cho gọn gàng. Tôi thấy nó mạnh mẽ hơn trong công việc của nó so với SimpleHTML. 2 công cụ riêng biệt cho 2 công việc khác nhau thực sự. – HappyTimeGopher

1

Lý do cụ thể nào bạn vẫn đang sử dụng API XML 4 PHP?

Nếu bạn có thể thoát khỏi bằng cách sử dụng API XML của PHP 5, có hai khả năng.

Trước tiên, hãy thử trình phân tích cú pháp HTML được tích hợp sẵn. Nó thực sự không phải là rất tốt (nó có xu hướng nghẹt thở trên HTML định dạng kém), nhưng nó có thể làm các trick. Có một cái nhìn tại DomDocument :: LoadHTML.

Thứ hai tùy chọn - bạn có thể thử phân tích cú pháp HTML dựa trên đặc điểm kỹ thuật phân tích cú pháp HTML5:

http://code.google.com/p/html5lib/

này có xu hướng làm việc tốt hơn so với xây dựng trong PHP phân tích cú pháp HTML. Nó tải HTML vào một đối tượng DomDocument.

+0

Tôi không muốn sử dụng trình phân tích cú pháp dom, vì tài liệu khá lớn. (Và tôi đã viết rất nhiều mã cho sax) –

0

Giải pháp là sử dụng DOMDocument.

Ví dụ:

$str = " 
<html> 
<head> 
    <title>test</title> 
</head> 
<body> 
    </div>error. 
    <p>another error</i> 
</body> 
</html> 
"; 

$doc = new DOMDocument(); 
@$doc->loadHTML($str); 
echo $doc->saveHTML(); 

Ưu điểm: natively bao gồm trong PHP, trái với PHP Tidy.

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