Tôi đồng ý rằng công cụ phù hợp để phân tích cú pháp XML và đặc biệt là HTML là một trình phân tích cú pháp chứ không phải là một công cụ biểu thức thông thường. Tuy nhiên, giống như những người khác đã chỉ ra, đôi khi sử dụng regex sẽ nhanh hơn, dễ dàng hơn và hoàn thành công việc nếu bạn biết định dạng dữ liệu.
Microsoft thực sự có một phần Thực tiễn tốt nhất cho các biểu thức chính quy trong .NET Framework và đặc biệt nói về việc xem xét [ing] Nguồn đầu vào .
Biểu thức chính quy có những hạn chế, nhưng bạn đã xem xét những điều sau đây chưa?
.NET framework là duy nhất khi nói đến các biểu thức chính quy ở chỗ nó hỗ trợ Định nghĩa nhóm cân bằng .
Vì lý do này, tôi tin rằng bạn CÓ THỂ phân tích cú pháp XML bằng các biểu thức thông thường. Tuy nhiên, xin lưu ý rằng đó phải là XML hợp lệ ( các trình duyệt rất tha thứ cho HTML và cho phép cú pháp XML xấu trong HTML ). Điều này là có thể vì "Định nghĩa nhóm cân bằng" sẽ cho phép công cụ biểu thức chính quy hoạt động như một thiết bị PDA.
Trích dẫn từ bài viết 1 trích dẫn ở trên:
.NET Công cụ biểu thức chính quy
Như mô tả ở trên, các cấu trúc cân bằng hợp lý không thể được mô tả bằng biểu thức chính quy. Tuy nhiên, công cụ biểu thức chính quy .NET cung cấp một vài cấu trúc cho phép các cấu trúc cân bằng được nhận dạng.
(?<group>)
- đẩy kết quả đã chụp vào ngăn xếp chụp với nhóm tên.
(?<-group>)
- bật ra phần bắt nhiều nhất với nhóm tên ngoài ngăn xếp.
(?(group)yes|no)
- khớp với phần có nếu tồn tại một nhóm với nhóm tên khác không khớp với phần đó.
Các cấu trúc này cho phép một biểu thức chính quy .NET mô phỏng một thiết bị bị hạn chế bằng cách cho phép các phiên bản đơn giản của các hoạt động ngăn xếp: đẩy, bật và trống. Các hoạt động đơn giản là khá nhiều tương đương với tăng, giảm và so sánh với không tương ứng. Điều này cho phép công cụ biểu thức chính quy .NET nhận ra một tập hợp con của các ngôn ngữ không ngữ cảnh, đặc biệt là các ngôn ngữ chỉ yêu cầu một bộ đếm đơn giản. Điều này đến lượt nó cho phép các biểu thức chính quy .NET không truyền thống nhận ra các cấu trúc cân bằng riêng lẻ.
Hãy xem xét các biểu thức chính quy sau:
(?=<ul\s+id="matchMe"\s+type="square"\s*>)
(?>
<!-- .*? --> |
<[^>]*/> |
(?<opentag><(?!/)[^>]*[^/]>) |
(?<-opentag></[^>]*[^/]>) |
[^<>]*
)*
(?(opentag)(?!))
Sử dụng các cờ:
- Đường đơn
- IgnorePotypeWhitespace (không cần thiết nếu bạn thu gọn regex và xóa tất cả khoảng trắng)
- IgnoreCase (không cần thiết)
Giải thích biểu thức chính quy (nội tuyến)
(?=<ul\s+id="matchMe"\s+type="square"\s*>) # match start with <ul id="matchMe"...
(?> # atomic group / don't backtrack (faster)
<!-- .*? --> | # match xml / html comment
<[^>]*/> | # self closing tag
(?<opentag><(?!/)[^>]*[^/]>) | # push opening xml tag
(?<-opentag></[^>]*[^/]>) | # pop closing xml tag
[^<>]* # something between tags
)* # match as many xml tags as possible
(?(opentag)(?!)) # ensure no 'opentag' groups are on stack
Bạn có thể thử điều này tại Trình kiểm tra biểu thức chính quy .NET tốt hơn .
Tôi đã sử dụng nguồn mẫu của:
<html>
<body>
<div>
<br />
<ul id="matchMe" type="square">
<li>stuff...</li>
<li>more stuff</li>
<li>
<div>
<span>still more</span>
<ul>
<li>Another >ul<, oh my!</li>
<li>...</li>
</ul>
</div>
</li>
</ul>
</div>
</body>
</html>
Điều này tìm thấy sự phù hợp:
<ul id="matchMe" type="square">
<li>stuff...</li>
<li>more stuff</li>
<li>
<div>
<span>still more</span>
<ul>
<li>Another >ul<, oh my!</li>
<li>...</li>
</ul>
</div>
</li>
</ul>
mặc dù nó thực sự xuất hiện như thế này:
<ul id="matchMe" type="square"> <li>stuff...</li> <li>more stuff</li> <li> <div> <span>still more</span> <ul> <li>Another >ul<, oh my!</li> <li>...</li> </ul> </div> </li> </ul>
Cuối cùng, tôi thực sự thích bài viết của Jeff Atwood: Phân tích cú pháp Html Cách Cthulhu . Hài hước lắm, nó trích dẫn câu trả lời cho câu hỏi này hiện có hơn 4k phiếu bầu.