Thực ra
<img src="imgtag.gif" alt="<img>" />
HTML không hợp lệ và cũng không phải là XML hợp lệ.
Nó không phải là XML hợp lệ vì '<' và '>' không phải là các ký tự hợp lệ bên trong các chuỗi thuộc tính. Chúng cần được thoát bằng cách sử dụng các thực thể XML tương ứng & lt; và & gt;
Nó cũng không phải là HTML hợp lệ vì hình thức đóng ngắn không được phép trong HTML (nhưng chính xác trong XML và XHTML). Thẻ 'img' cũng là một thẻ được đóng hoàn toàn theo thông số kỹ thuật HTML 4.01. Điều này có nghĩa là việc đóng thủ công nó thực sự sai và tương đương với việc đóng bất kỳ thẻ nào khác hai lần.
Phiên bản chính xác trong HTML là
<img src="imgtag.gif" alt="<img>">
và phiên bản chính xác trong XHTML và XML là
<img src="imgtag.gif" alt="<img>"/>
Ví dụ sau bạn đưa ra cũng không hợp lệ
<
tag
attr="5"
/>
Đây cũng không phải là HTML hoặc XML hợp lệ. Tên của thẻ phải ở ngay sau '<', mặc dù các thuộc tính và đóng '>' có thể là bất cứ nơi nào chúng muốn. Vì vậy, XML hợp lệ thực sự là
<tag
attr="5"
/>
Và đây là một trò vui khác: bạn thực sự có thể chọn sử dụng "hoặc" làm ký tự trích dẫn thuộc tính của mình
<img src="image.gif" alt='This is single quoted AND valid!'>
Tất cả các lý do khác đã được đăng là chính xác, nhưng vấn đề lớn nhất với phân tích cú pháp HTML là mọi người thường không hiểu chính xác tất cả các quy tắc cú pháp. Việc trình duyệt của bạn diễn giải các thẻ của bạn dưới dạng HTML không có nghĩa là bạn đã thực sự viết HTML hợp lệ.
Chỉnh sửa: Và thậm chí stackoverflow.com đồng ý với tôi về định nghĩa hợp lệ và không hợp lệ. XML / HTML không hợp lệ của bạn không được tô sáng, trong khi phiên bản đã sửa của tôi là.
Về cơ bản, XML không được phân tích cú pháp bằng biểu thức chính quy. Nhưng cũng không có lý do để làm như vậy. Có rất nhiều, rất nhiều trình phân tích cú pháp XML cho mỗi và mọi ngôn ngữ. Bạn có thể lựa chọn giữa trình phân tích cú pháp SAX, trình phân tích cú pháp DOM và trình phân tích cú pháp Pull. Tất cả những thứ này được đảm bảo sẽ nhanh hơn nhiều so với phân tích cú pháp với regrec và sau đó bạn có thể sử dụng các công nghệ tuyệt vời như XPath hoặc XSLT trên cây DOM kết quả.
Do đó, câu trả lời của tôi là: không chỉ phân tích cú pháp XML với regexps khó mà còn là một ý tưởng tồi. Chỉ cần sử dụng một trong hàng triệu trình phân tích cú pháp XML hiện có và tận dụng tất cả các tính năng nâng cao của XML.
HTML quá khó để tự mình phân tích cú pháp. Đầu tiên, cú pháp pháp lý có nhiều điểm tinh tế nhỏ mà bạn có thể không biết và thứ hai, HTML trong tự nhiên chỉ là một đống hôi thối khổng lồ (bạn hiểu ý tôi). Có một loạt các thư viện phân tích cú pháp lỏng lẻo làm tốt công việc xử lý HTML như súp thẻ, chỉ cần sử dụng các thư viện này.