Tôi đã xem xét các giải pháp dựa trên Regex được đề xuất ở đây và chúng không làm tôi tự tin ngoại trừ trong các trường hợp tầm thường nhất. Một khung góc trong một thuộc tính là tất cả những gì nó cần để phá vỡ, chứ đừng nói đến HTML có dạng mal từ tự nhiên. Và những gì về các thực thể như thế &
nào? Nếu bạn muốn chuyển đổi HTML thành văn bản thuần túy, bạn cũng cần giải mã các thực thể.
Vì vậy, tôi đề xuất phương pháp dưới đây.
Sử dụng HtmlAgilityPack , phương thức tiện ích mở rộng này loại bỏ hiệu quả tất cả các thẻ HTML khỏi một đoạn html. Cũng giải mã các thực thể HTML như &
. Chỉ trả về các mục văn bản bên trong, với một dòng mới giữa mỗi mục văn bản.
public static string RemoveHtmlTags(this string html)
{
if (String.IsNullOrEmpty(html))
return html;
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
{
return WebUtility.HtmlDecode(html);
}
var sb = new StringBuilder();
var i = 0;
foreach (var node in doc.DocumentNode.ChildNodes)
{
var text = node.InnerText.SafeTrim();
if (!String.IsNullOrEmpty(text))
{
sb.Append(text);
if (i < doc.DocumentNode.ChildNodes.Count - 1)
{
sb.Append(Environment.NewLine);
}
}
i++;
}
var result = sb.ToString();
return WebUtility.HtmlDecode(result);
}
public static string SafeTrim(this string str)
{
if (str == null)
return null;
return str.Trim();
}
Nếu bạn đang thực sự nghiêm trọng, bạn muốn bỏ qua nội dung của các thẻ HTML nào đó quá ( <script>
, <style>
, <svg>
, <head>
, <object>
tôi suy nghĩ!) Bởi vì họ có thể không chứa nội dung có thể đọc theo nghĩa chúng ta đang theo đuổi. Những gì bạn làm ở đó sẽ phụ thuộc vào hoàn cảnh của bạn và bạn muốn đi bao xa, nhưng sử dụng HtmlAgilityPack, nó sẽ khá tầm thường đối với danh sách trắng hoặc danh sách đen các thẻ được chọn.
Nếu bạn đang hiển thị nội dung trở lại trang HTML, hãy đảm bảo bạn hiểu lỗ hổng XSS & cách ngăn chặn - tức là luôn mã hóa bất kỳ văn bản nào do người dùng nhập trở lại vào trang HTML ( >
trở thành >
v.v.).