Có những giải pháp ưa thích liên quan đến việc sử dụng chính trình duyệt để cố gắng phân tích cú pháp văn bản, xác định xem có bất kỳ nút DOM nào được xây dựng hay không, điều này sẽ… chậm. Hoặc biểu thức chính quy sẽ nhanh hơn, nhưng… có khả năng không chính xác. Cũng có hai câu hỏi rất khác biệt nảy sinh từ vấn đề này:
Q1: Một chuỗi có chứa các đoạn HTML không?
Chuỗi có phải là một phần của tài liệu HTML, chứa đánh dấu phần tử HTML hoặc các thực thể được mã hóa không? Điều này có thể được sử dụng như một chỉ báo rằng chuỗi có thể yêu cầu tẩy trắng / làm vệ sinh hoặc giải mã thực thể:
/</?[a-z][^>]*>|(\&(?:[\w\d]+|#\d+|#x[a-f\d]+);/
Bạn có thể thấy mẫu này được sử dụng đối với tất cả các ví dụ từ tất cả các câu trả lời hiện có tại thời điểm viết bài này, cộng với một số… văn bản mẫu khá ghê tởm do WYSIWYG- hoặc Word tạo và nhiều tham chiếu thực thể ký tự.
Câu hỏi 2: Chuỗi có phải là tài liệu HTML không?
Đặc tả HTML lỏng lẻo một cách đáng kinh ngạc so với những gì nó coi là một tài liệu HTML . Các trình duyệt có độ dài cực cao để phân tích gần như bất kỳ văn bản rác nào dưới dạng HTML. Hai cách tiếp cận: hoặc chỉ xem xét mọi thứ HTML (vì nếu được phân phối với text/html
Loại-Nội dung, thì tác nhân người dùng sẽ phải nỗ lực rất nhiều để cố gắng diễn giải nó thành HTML) hoặc tìm kiếm điểm đánh dấu tiền tố:
<!DOCTYPE html>
Về mặt "hình thành tốt", điều đó, và hầu như không có gì khác là "bắt buộc". Sau đây là tài liệu HTML hoàn chỉnh, hoàn toàn hợp lệ 100% chứa mọi phần tử HTML mà bạn cho rằng đang bị bỏ qua:
<!DOCTYPE html>
<title>Yes, really.</title>
<p>This is everything you need.
Đúng vậy. Có những quy tắc rõ ràng về cách tạo "mất tích" các yếu tố như <html>
, <head>
, và <body>
. Mặc dù tôi thấy khá thú vị khi đánh dấu cú pháp của SO không phát hiện được đúng cách mà không có gợi ý rõ ràng.