2010-03-24 28 views
6

Tôi đang cố gắng sử dụng cụm từ Regex tôi đã tìm thấy trong trang web này và dường như nó không hoạt động. Bất kỳ ý tưởng?Sử dụng Regex để xóa thẻ tập lệnh

chuỗi Input:

sFetch = "123<script type=\"text/javascript\">\n\t\tfunction utmx_section(){}function utmx(){}\n\t\t(function()})();\n\t</script>456"; 

Regex:

sFetch = Regex.Replace(sFetch, "<script.*?>.*?</script>", "", RegexOptions.IgnoreCase); 
+4

Bạn không nên sử dụng regex để cố gắng * phân tích cú pháp * HTML: HTML không hoàn toàn thường xuyên ;; thay vào đó, bạn nên sử dụng Trình phân tích cú pháp HTML - như dựa trên DOM. –

+2

Có vẻ như bạn chưa đọc bài viết này giải thích cách sử dụng regex để phân tích cú pháp HTML: http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/ 1732454 # 1732454 –

+0

Xem câu trả lời của S.Mark. Nhưng tất cả trong tất cả, nó không phải là một regex tốt, và dù sao regexes không thực sự phù hợp cho việc này. –

Trả lời

9

Thêm RegexOptions.Singleline

RegexOptions.IgnoreCase | RegexOptions.Singleline 

Và đó sẽ không bao giờ làm việc trên theo một.

<script 
> 
alert(1) 
</script 
/**/ 
> 

Vì vậy, Tìm một phân tích cú pháp HTML như HTML Agility Pack

+0

Cảm ơn. Bất kỳ đề xuất nào khác về gói C# như Agility để phân tích cú pháp HTML ??? – amitre

+0

'Singleline' là tùy chọn bạn muốn; nó cho phép '.' khớp với các dòng dữ liệu. 'Multiline' gây ra' $ 'và'^'để so khớp trước và sau (tương ứng) dòng dữ liệu; nó không liên quan ở đây. –

+0

@Alan, Bạn đã đúng! đã sửa! – YOU

7

Lý do regex thất bại là đầu vào của bạn có newlines và char meta . không phù hợp với nó.

Để giải quyết điều này, bạn có thể sử dụng tùy chọn RegexOptions.Singleline như S.Mark nói, hoặc bạn có thể thay đổi regex để:

"<script[\d\D]*?>[\d\D]*?</script>" 

mà sử dụng [\d\D] thay vì ..

\d là bất kỳ chữ số nào và \D là bất kỳ chữ số nào, vì vậy [\d\D] là chữ số hoặc chữ số không thực sự là bất kỳ chữ cái nào.

+0

Cảm ơn. Đây có phải là giải pháp cho các thẻ tập lệnh lồng nhau không? – amitre

1

Đây là một chút ngắn hơn:

"<script[^<]*</script>" 

hoặc

"<[^>]*>[^>]*>" 
+0

Cảm ơn. Đây có phải là giải pháp cho các thẻ tập lệnh lồng nhau không? – amitre

+0

Có, tuyệt đối vì các tập lệnh không bao giờ được lồng vào nhau. – instcode

+1

Chúng có thể được lồng trong một cách, thực sự. Ví dụ: nếu ai đó chỉ định biến như 'var a =" ";' bên trong nó. – DitherSky

4

Nếu bạn thực sự muốn để khử trùng một chuỗi html (và bạn đang sử dụng NET) sau đó hãy xem tại Microsoft Web Protection Library :

Sanitizer.GetSafeHtmlFragment(untrustedHtml); 

Có mô tả here.

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