HTML / XML được chia thành đánh dấu và nội dung. Regex chỉ hữu ích khi thực hiện phân tích thẻ từ vựng. Tôi đoán bạn có thể suy luận nội dung. Nó sẽ là một lựa chọn tốt cho trình phân tích cú pháp SAX. Các thẻ và nội dung có thể được gửi đến một chức năng do người dùng xác định trong đó việc lồng / đóng các phần tử có thể được theo dõi.
Theo như phân tích các thẻ, nó có thể được thực hiện với regex và được sử dụng để tách các thẻ từ một tài liệu.
Qua nhiều năm thử nghiệm, tôi đã tìm thấy bí mật về cách trình duyệt phân tích các thẻ, cả hình thành tốt và xấu.
Các yếu tố bình thường được phân tích cú pháp với hình thức này:
Cốt lõi của các thẻ này sử dụng regex này
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
Bạn sẽ nhận thấy đây [^>]?
là một trong những lựa chọn thay thế. Điều này sẽ phù hợp với trích dẫn không cân bằng từ các thẻ không định hình.
Nó cũng là, gốc rễ duy nhất của tất cả các biểu hiện xấu xa thông thường. Cách nó được sử dụng sẽ kích hoạt một cú va chạm để thỏa mãn thùng chứa định lượng phải phù hợp, tham lam của nó.
Nếu được sử dụng một cách thụ động, sẽ không bao giờ có vấn đề Nhưng, nếu bạn buộc một thứ gì đó khớp với nhau bằng cách xen kẽ nó với một cặp thuộc tính / giá trị mong muốn và không cung cấp sự bảo vệ đầy đủ khỏi việc quay lui, đó là một cơn ác mộng ngoài tầm kiểm soát.
Đây là hình thức chung cho các thẻ cũ đơn giản. Chú ý tên [\w:]
đại diện? Trong thực tế, các ký tự pháp lý đại diện cho tên thẻ là một danh sách đáng kinh ngạc của các ký tự Unicode.
<
(?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
>
Tiếp tục, chúng tôi cũng thấy rằng bạn không thể tìm kiếm một thẻ cụ thể mà không phân tích TẤT CẢ các thẻ. Ý tôi là bạn có thể, nhưng nó sẽ phải sử dụng kết hợp các động từ như (* SKIP) (* FAIL) nhưng tất cả các thẻ phải được phân tích cú pháp.
Lý do là cú pháp thẻ có thể được ẩn bên trong các thẻ khác, v.v.
Vì vậy, để phân tích thụ động tất cả các thẻ, một regex là cần thiết như bên dưới. Điều này đặc biệt phù hợp với nội dung vô hình là tốt.
Khi HTML hoặc xml mới hoặc bất kỳ cấu trúc mới nào khác phát triển, chỉ cần thêm nó dưới dạng một trong các lựa chọn thay thế.
Lưu ý trang web - Tôi chưa bao giờ thấy một trang web (hoặc xhtml / xml) mà điều này
gặp sự cố. Nếu bạn tìm thấy một, cho tôi biết.
Ghi chú hiệu suất - Thật nhanh chóng. Đây là trình phân tích cú pháp thẻ nhanh nhất tôi từng thấy
(có thể nhanh hơn, ai biết được).
Tôi có một vài phiên bản cụ thể. Nó cũng là tuyệt vời như cạp
(nếu bạn là loại thực hành).
Hoàn thành regex thô
<(?:(?:(?:(script|style|object|embed|applet|noframes|noscript|noembed)(?:\s+(?>"[\S\s]*?"|'[\S\s]*?'|(?:(?!/>)[^>])?)+)?\s*>)[\S\s]*?</\1\s*(?=>))|(?:/?[\w:]+\s*/?)|(?:[\w:]+\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]?)+\s*/?)|\?[\S\s]*?\?|(?:!(?:(?:DOCTYPE[\S\s]*?)|(?:\[CDATA\[[\S\s]*?\]\])|(?:--[\S\s]*?--)|(?:ATTLIST[\S\s]*?)|(?:ENTITY[\S\s]*?)|(?:ELEMENT[\S\s]*?))))>
Định dạng
<
(?:
(?:
(?:
# Invisible content; end tag req'd
( # (1 start)
script
| style
| object
| embed
| applet
| noframes
| noscript
| noembed
) # (1 end)
(?:
\s+
(?>
" [\S\s]*? "
| ' [\S\s]*? '
| (?:
(?! /> )
[^>]
)?
)+
)?
\s* >
)
[\S\s]*? </ \1 \s*
(?= > )
)
| (?: /? [\w:]+ \s* /? )
| (?:
[\w:]+
\s+
(?:
" [\S\s]*? "
| ' [\S\s]*? '
| [^>]?
)+
\s* /?
)
| \? [\S\s]*? \?
| (?:
!
(?:
(?: DOCTYPE [\S\s]*? )
| (?: \[CDATA\[ [\S\s]*? \]\] )
| (?: -- [\S\s]*? -- )
| (?: ATTLIST [\S\s]*? )
| (?: ENTITY [\S\s]*? )
| (?: ELEMENT [\S\s]*? )
)
)
)
>