Tôi đang cố gắng phân tích cú pháp mã HTML bằng DOMDocument, thực hiện các công cụ như thay đổi đối với nó, sau đó lắp lại nó thành chuỗi mà tôi gửi đến đầu ra.Làm cách nào để làm cho HTML5 hoạt động với DOMDocument?
Nhưng có một vài vấn đề liên quan đến phân tích cú pháp, có nghĩa là những gì tôi gửi cho DOMDocument không phải lúc nào trở lại trong hình thức tương tự :)
Dưới đây là một danh sách:
sử dụng ->loadHTML:
- định dạng tài liệu của mình bất kể cài đặt
preserveWhitespace
vàformatOutput
(mất khoảng trắng trên văn bản được định dạng trước) - cho tôi lỗi khi tôi có các thẻ html5 như
<header>
,<footer>
vv Nhưng chúng có thể bị chặn lại, vì vậy tôi có thể sống với điều này. - sản xuất đánh dấu không phù hợp - ví dụ nếu tôi thêm một yếu tố
<link ... />
(với một thẻ tự đóng), sau khi phân tích cú pháp/saveHTML sản lượng sẽ được<link .. >
- định dạng tài liệu của mình bất kể cài đặt
sử dụng ->loadXML:
- mã hóa các đối tượng như
>
từ<style>
hoặc<script>
thẻ:body > div
trở thànhbody > div
- tất cả các thẻ đều đóng cùng một cách, ví dụ
<meta ... />
trở thành<meta...></meta>
; nhưng điều này có thể được sửa bằng regex.
- mã hóa các đối tượng như
Tôi không cố gắng HTML5lib nhưng tôi muốn DOMDocument thay vì một phân tích cú pháp tùy chỉnh cho lý do hiệu suất
Cập nhật:
Vì vậy, như Honeymonster đề cập bằng các bản sửa lỗi CDATA vấn đề chính với loadXML.
Có cách nào tôi có thể ngăn tự đóng tất cả các thẻ HTML trống bên cạnh một tập hợp nhất định mà không sử dụng regex không?
Ngay bây giờ tôi có:
$html = $dom->saveXML($node);
$html = preg_replace_callback('#<(\w+)([^>]*)\s*/>#s', function($matches){
// ignore only these tags
$xhtml_tags = array('br', 'hr', 'input', 'frame', 'img', 'area', 'link', 'col', 'base', 'basefont', 'param' ,'meta');
// if a element that is not in the above list is empty,
// it should close like `<element></element>` (for eg. empty `<title>`)
return in_array($matches[1], $xhtml_tags) ? "<{$matches[1]}{$matches[2]} />" : "<{$matches[1]}{$matches[2]}></{$matches[1]}>";
}, $html);
mà hoạt động nhưng nó cũng sẽ làm việc thay thế trong nội dung CDATA, mà tôi không muốn ...
Bạn có đoạn thử nghiệm mà chúng tôi có thể chơi cùng không? –
Làm cách nào để biết html5lib chậm hơn DOMDocument nếu bạn thậm chí không thử nó? – Brad
Tôi giả định rằng bởi vì nó được viết bằng PHP .. DOMDocument là một phần mở rộng PHP được viết bằng C – Alex