Làm cách nào để xóa tất cả các thẻ HTML khỏi một chuỗi mà không biết có những thẻ nào trong đó?


122

Có cách nào dễ dàng để xóa tất cả các thẻ HTML hoặc BẤT KỲ THỨ GÌ HTML liên quan khỏi một chuỗi không?

Ví dụ:

string title = "<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)"

Những điều trên thực sự phải là:

"Đấu vật vô địch người nổi tiếng của Hulk Hogan [Proj # 206010] (Series thực tế)"


Câu hỏi này được đóng lại do trùng lặp nhưng câu trả lời gợi ý được đưa ra bằng cách sử dụng Html Agility Pack. Nếu bạn muốn loại bỏ các thẻ html không sử dụng gói Html Agility, bạn có thể tham khảo câu trả lời của tôi tại đây stackoverflow.com/a/30026043/2318354 . Điều này có thể hữu ích cho một số người
Dilip0165

6
Đây không phải là một bản sao, vì "HTML agility pack - xóa các thẻ không mong muốn mà không xóa nội dung?" muốn giữ lại một số thẻ (tức là đưa ra danh sách các thẻ hợp lệ, loại bỏ phần còn lại). Câu hỏi này ở đây là về việc xóa TẤT CẢ các thẻ. Và tôi không thể sử dụng các câu trả lời của câu hỏi khác vì tôi sẽ không chuyển vào danh sách tất cả các thẻ html đang tồn tại.
Thierry_S

Hãy nhìn vào xidel . Nó sẽ đưa bạn đi 95% con đường đến đó với xidel -s input -e '/'.
Josh Habdas

Câu trả lời:


247

Bạn có thể sử dụng một regex đơn giản như sau:

public static string StripHTML(string input)
{
   return Regex.Replace(input, "<.*?>", String.Empty);
}

Cần biết rằng giải pháp này có lỗ hổng riêng của nó. Xem Xóa thẻ HTML trong Chuỗi để biết thêm thông tin (đặc biệt là các nhận xét của @mehaase)

Một giải pháp khác là sử dụng HTML Agility Pack .
Bạn có thể tìm thấy một ví dụ bằng cách sử dụng thư viện tại đây: HTML agility pack - loại bỏ các thẻ không mong muốn mà không xóa nội dung?


2
Không làm việc cho đầu vào: '7 <10 <b> nhưng </ b> 30> 10' nó mang lại: '7 nhưng 30> 10'
Bartosz Pierzchlewicz

Có, bởi vì nó tách mọi thứ giữa <và>, vì vậy trong trường hợp của bạn, < 10 <b></b>cả hai đều bị loại bỏ.
Bidou

2
Tên phương thức không nên là StripHtml () vì tên phương thức nên sử dụng trường hợp Pascal?
David Klempfner

Sử dụng biểu thức chính quy cho điều này có lẽ không phải là một ý tưởng hay nếu bạn đang sử dụng nó vì lý do bảo mật.
Mathias Lykkegaard Lorenzen 19/09/18

3
Chỉ cần thay đổi các regex để <[a-zA-Z /] *?>
Brandon thận trọng

54

Bạn có thể phân tích cú pháp chuỗi bằng cách sử dụng gói Html Agility và lấy InnerText.

    HtmlDocument htmlDoc = new HtmlDocument();
    htmlDoc.LoadHtml(@"<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)");
    string result = htmlDoc.DocumentNode.InnerText;

Tôi thích InnerTextgiải pháp vì nó loại bỏ tất cả các thẻ. Nhưng ... nó để lại đằng sau &nbsp;và cũng có thể bình luận tags như <!-- xxx --> như những người xung quanh v:shapetype, v:shapehoặc v:imagedatavới [if gte vml 1]hoặc[if !vml]
Thierry_S

7
Tôi nhận ra rằng &nbsp;là một thực thể html, không phải là một thẻ, do đó, một giải pháp để loại bỏ có thể được result = WebUtility.HtmlDecode(result);và để loại bỏ các nút bình luận, sử dụng Html Agility Pack: htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());ngay trước khi làmresult = htmlDoc.DocumentNode.InnerText;
Thierry_S

3

Bạn có thể sử dụng mã dưới đây trên chuỗi của mình và bạn sẽ nhận được chuỗi hoàn chỉnh mà không có phần html.

string title = "<b> Hulk Hogan's Celebrity Championship Wrestling &nbsp;&nbsp;&nbsp;<font color=\"#228b22\">[Proj # 206010]</font></b>&nbsp;&nbsp;&nbsp; (Reality Series, &nbsp;)".Replace("&nbsp;",string.Empty);            
        string s = Regex.Replace(title, "<.*?>", String.Empty);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.