Bagaimana cara menghapus semua tag HTML dari sebuah string tanpa mengetahui tag mana yang ada di dalamnya?

122

Apakah ada cara mudah untuk menghapus semua tag HTML atau SEMUA HTML terkait dari sebuah string?

Sebagai contoh:

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;)"

Di atas benar-benar harus:

"Gulat Kejuaraan Selebriti Hulk Hogan [Proj # 206010] (Seri Realitas)"

RJ.
sumber
Pertanyaan ini ditutup karena duplikasi tetapi jawaban yang disarankan diberikan menggunakan Html Agility Pack. Jika Anda ingin menghapus tag html tanpa menggunakan paket Agility Html Anda dapat merujuk jawaban saya di sini stackoverflow.com/a/30026043/2318354 . Yang mungkin berguna bagi seseorang
Dilip0165
6
Ini bukan duplikat, karena "paket agility HTML - menghapus tag yang tidak diinginkan tanpa menghapus konten?" ingin menyimpan beberapa tag (mis., berikan daftar tag yang valid, hapus sisanya). Pertanyaan di sini adalah tentang menghapus SEMUA tag. Dan saya tidak dapat menggunakan jawaban dari pertanyaan lain karena saya tidak akan meneruskan daftar semua tag html yang ada.
Thierry_S
Lihatlah xidel . Ini akan membawa Anda 95% dari jalan ke sana dengan xidel -s input -e '/'.
Josh Habdas

Jawaban:

247

Anda dapat menggunakan regex sederhana seperti ini:

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

Ketahuilah bahwa solusi ini memiliki kekurangannya sendiri. Lihat Menghapus tag HTML di String untuk informasi lebih lanjut (terutama komentar @mehaase)

Solusi lain adalah menggunakan HTML Agility Pack .
Anda dapat menemukan contoh menggunakan pustaka di sini: Paket agility HTML - menghapus tag yang tidak diinginkan tanpa menghapus konten?

Bidou
sumber
2
Tidak bekerja untuk masukan: '7 <10 <b> tapi </b> 30> 10' menghasilkan: '7 but 30> 10'
Bartosz Pierzchlewicz
Ya, karena itu menghapus segala sesuatu di antara <dan>, jadi dalam kasus Anda, < 10 <b>dan </b>keduanya dilucuti.
Bidou
2
Bukankah nama metode harus StripHtml () karena nama metode harus menggunakan kasus Pascal?
David Klempfner
Menggunakan ekspresi reguler untuk ini mungkin bukan ide yang baik jika Anda menggunakannya untuk alasan keamanan.
Mathias Lykkegaard Lorenzen
3
Cukup ubah regex menjadi <[a-zA-Z /] *?>
Brandon Prudent
54

Anda dapat mengurai string menggunakan paket Agility Html dan mendapatkan 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;
ssilas777
sumber
Saya suka InnerTextsolusinya karena menghapus semua tag. Tapi ... meninggalkan &nbsp;dan juga tag komentar seperti <!-- xxx --> seperti yang ada di sekitarnya v:shapetype, v:shapeatau v:imagedatadengan [if gte vml 1]atau[if !vml]
Thierry_S
7
Saya menyadari bahwa itu &nbsp;adalah entitas html, bukan tag, jadi solusi untuk menghapusnya result = WebUtility.HtmlDecode(result);dan menghapus node komentar, menggunakan Paket Agility Html: htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());sebelum melakukanresult = htmlDoc.DocumentNode.InnerText;
Thierry_S
3

Anda dapat menggunakan kode di bawah ini pada string Anda dan Anda akan mendapatkan string lengkap tanpa bagian 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);
Vinay
sumber