2008-11-18 35 views
7

Tôi có một chuỗi các thử nghiệm như thế này:RegEx phù hợp với các thẻ HTML và giải nén văn bản

<customtag>hey</customtag> 

Tôi muốn sử dụng một RegEx để sửa đổi văn bản giữa các "customtag" thẻ để nó có thể trông như thế này:

<customtag>hey, this is changed!</customtag> 

Tôi biết rằng tôi có thể sử dụng Trình so khớp xác định để sửa đổi văn bản, nhưng tôi không chắc chắn về cú pháp RegEx thích hợp để sử dụng. Bất kì sự trợ giúp nào đều được đánh giá cao.

+2

các [câu trả lời tốt nhất] (http://stackoverflow.com/a/1732454/80274) cho câu hỏi này đến nay . –

Trả lời

15

tôi sẽ không sử dụng regex hoặc cho điều này, nhưng nếu bạn phải biểu hiện này nên làm việc: <customtag>(.+?)</customtag>

+0

Cảm ơn - điều này đã hoạt động hoàn hảo. Thông thường tôi sẽ không sử dụng RegEx để phân tích cú pháp HTML như thế này, nhưng HTML này là từ một hệ thống nội bộ và được định dạng đúng. –

+2

Như một cảnh báo cho người khác: nó sẽ không hoạt động đúng cú pháp được định dạng | Một số văn bản | - vùng giữa các ký hiệu ống được khớp, do đó, thứ hai sẽ bị xóa để lại XML được định dạng sai. –

+1

Yea và đây là lý do tại sao bạn không nên phân tích cú pháp xml bằng regex. Bạn có thể giới hạn những gì có thể đi giữa các thẻ và chỉ cho phép chữ cái, số và khoảng trắng và nó sẽ hoạt động tốt hơn một chút. Nhưng sau đó được giới hạn ở một miền cụ thể, vì vậy, như sau: ([a-zA-Z0-9]) + Tjofras

7

Tôi muốn nhai chân của mình trước khi sử dụng cụm từ thông dụng để phân tích cú pháp và thay đổi HTML.

Sử dụng XSL hoặc DOM.


Hai nhận xét đã yêu cầu tôi làm rõ. Việc thay thế biểu thức chính quy hoạt động trong trường hợp cụ thể trong câu hỏi của OP, nhưng nói chung các biểu thức chính quy không phải là một giải pháp tốt. Cụm từ thông dụng có thể khớp với regular languages, tức là một chuỗi đầu vào có thể được máy trạng thái hữu hạn chấp nhận. HTML có thể chứa các thẻ lồng nhau ở bất kỳ độ sâu tùy ý nào, vì vậy nó không phải là ngôn ngữ thông thường.

Điều này có liên quan gì đến câu hỏi này? Sử dụng cụm từ thông dụng cho câu hỏi của OP vì nó được viết, nhưng nếu nội dung giữa các thẻ có chứa các thẻ khác thì sao? Điều gì sẽ xảy ra nếu một ký tự chữ số < xuất hiện trong văn bản? Đã 11 tháng kể từ khi Jon Tackabury hỏi câu hỏi, và tôi đoán rằng trong thời gian đó, sự phức tạp của vấn đề của anh ta có thể tăng lên.

Cụm từ thông dụng là các công cụ tuyệt vời và tôi luôn sử dụng chúng. Nhưng việc sử dụng chúng thay cho một trình phân tích cú pháp thực sự cho đầu vào cần có một trình phân tích sẽ hoạt động chỉ trong các trường hợp rất đơn giản. Đó là thực tế không thể tránh khỏi rằng những trường hợp này phát triển vượt ra ngoài những gì biểu thức thông thường có thể xử lý. Khi điều đó xảy ra, bạn sẽ bị cám dỗ để viết một biểu thức chính quy phức tạp hơn, nhưng chúng nhanh chóng trở nên rất mất thời gian để phát triển và gỡ lỗi. Hãy sẵn sàng để giải quyết các giải pháp biểu thức chính quy khi các yêu cầu phân tích mở rộng.

XSL và DOM là hai công nghệ tiêu chuẩn được thiết kế để hoạt động với đánh dấu XML hoặc XHTML. Cả hai công nghệ đều biết cách phân tích cú pháp các tệp đánh dấu có cấu trúc, theo dõi các thẻ lồng nhau và cho phép bạn chuyển đổi các thuộc tính hoặc nội dung của thẻ.

Dưới đây là một vài bài viết về cách sử dụng XSL với C#:

Dưới đây là một vài bài viết về cách sử dụng DOM với C#:

Đây là a.NET thư viện mà hỗ trợ các hoạt động DOM và XSL về HTML:

+0

Thỉnh thoảng, thỉnh thoảng tôi sử dụng chúng, trên môi trường được kiểm soát, với mã được tạo bằng máy được biết là nhất quán, để có công việc nhanh chóng ... – PhiLho

+4

Sau đó, tại sao bạn không chỉ cho chúng tôi cách thực hiện với XSL hoặc DOM trong C#? Thật dễ dàng để thực hiện các câu lệnh quét. Hãy xem mã thực tế. Regexes không thích hợp để phân tích cú pháp HTML chung, nhưng chúng hoàn toàn phù hợp để làm những việc cụ thể với mã HTML cụ thể. –

+0

Tôi thừa nhận bạn đã làm cho tôi cười, nhưng chúng ta hãy có một lời giải thích, hoặc một liên kết đến một lời giải thích tốt về lý do tại sao bạn muốn nhai chân của bạn đi. Tôi đoán nó thực sự rõ ràng lý do tại sao để một số lập trình viên, nhưng có lẽ không phải cho người mới? –

1

Nếu sẽ không có bất kỳ thẻ nào khác giữa hai thẻ, regex này an toàn hơn một chút và hiệu quả hơn:

<customtag>[^<>]*</customtag> 
0
//This is to replace all HTML Text 

var re = new RegExp("<[^>]*>", "g"); 

var x2 = Content.replace(re,""); 

//This is to replace all &nbsp; 

var x3 = x2.replace(/\u00a0/g,''); 
0

Hầu hết mọi người sử dụng Gói nhanh nhẹn HTML để phân tích văn bản HTML. Tuy nhiên, tôi tìm thấy nó một chút mạnh mẽ và phức tạp cho nhu cầu của riêng tôi. Tôi tạo một điều khiển trình duyệt web trong bộ nhớ, tải trang và sao chép văn bản từ đó. (Xem ví dụ dưới đây)

Bạn có thể tìm 3 ví dụ đơn giản ở đây:

http://jakemdrew.wordpress.com/2012/02/03/getting-only-the-text-displayed-on-a-webpage-using-c/

Các vấn đề liên quan