Saya telah melihat solusi berbasis Regex yang disarankan di sini, dan mereka tidak membuat saya percaya diri kecuali dalam kasus yang paling sepele. Sebuah tanda kurung sudut dalam atribut adalah semua yang diperlukan untuk merusak, apalagi HTML yang salah format dari alam liar. Dan bagaimana dengan entitas seperti itu &
? Jika Anda ingin mengubah HTML menjadi teks biasa, Anda juga perlu mendekode entitas.
Jadi saya mengusulkan metode di bawah ini.
Menggunakan HtmlAgilityPack , metode ekstensi ini secara efisien menghapus semua tag HTML dari fragmen html. Juga menerjemahkan entitas HTML seperti &
. Mengembalikan hanya item teks bagian dalam, dengan baris baru di antara setiap item teks.
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();
}
Jika Anda benar-benar serius, kau ingin mengabaikan isi tag HTML tertentu juga ( <script>
, <style>
, <svg>
, <head>
, <object>
datang ke pikiran!) Karena mereka mungkin tidak mengandung konten yang dapat dibaca dalam arti kita setelah. Apa yang Anda lakukan di sana akan bergantung pada keadaan Anda dan seberapa jauh Anda ingin melangkah, tetapi menggunakan HtmlAgilityPack akan sangat mudah untuk memasukkan tag yang dipilih ke daftar putih atau daftar hitam.
Jika Anda merender konten kembali ke halaman HTML, pastikan Anda memahami kerentanan XSS & cara mencegahnya - yaitu selalu menyandikan teks yang dimasukkan pengguna yang dirender kembali ke halaman HTML ( >
menjadi >
dll.).