İçinde hangi etiketlerin olduğunu bilmeden bir dizeden tüm HTML etiketlerini nasıl kaldırırım?


123

Bir dizeyle ilgili tüm HTML etiketlerini veya HERHANGİ BİR HTML'yi kaldırmanın kolay bir yolu var mı?

Örneğin:

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

Yukarıdakiler gerçekten şöyle olmalıdır:

"Hulk Hogan'ın Ünlü Şampiyonası Güreşi [Proj # 206010] (Reality Series)"


Bu soru tekrarlama nedeniyle kapatılmıştır ancak önerilen cevap Html Çeviklik Paketi kullanılarak verilmiştir. Html etiketlerini Html Çeviklik paketini kullanmadan kaldırmak istiyorsanız, cevabıma buradan ulaşabilirsiniz stackoverflow.com/a/30026043/2318354 . Bu birisine yardımcı olabilir
Dilip0165

6
Bu, "HTML çeviklik paketi - istenmeyen etiketleri içeriği kaldırmadan kaldırmak mı?" Gibi bir kopya değil. bazı etiketleri saklamak istiyor (yani, geçerli etiketlerin bir listesini verin, geri kalanını kaldırın). Buradaki soru TÜM etiketleri kaldırmakla ilgilidir. Ve var olan tüm html etiketlerinin bir listesini vermeyeceğim için diğer sorunun cevaplarını kullanamıyorum.
Thierry_S

Xidel'e bir göz atın . Orada yolun% 95'ini alacak xidel -s input -e '/'.
Josh Habdas

Yanıtlar:


248

Bunun gibi basit bir normal ifade kullanabilirsiniz:

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

Bu çözümün kendi kusuru olduğunu unutmayın. Daha fazla bilgi için (özellikle @mehaase yorumları) Dize'deki HTML etiketlerini kaldırma konusuna bakın.

Başka bir çözüm de HTML Agility Pack kullanmaktır .
Kitaplığı kullanarak burada bir örnek bulabilirsiniz: HTML çeviklik paketi - istenmeyen etiketleri içeriği kaldırmadan kaldırmak mı?


2
Giriş için çalışmıyor: '7 <10 <b> ama </b> 30> 10' şunu veriyor: '7 but 30> 10'
Bartosz Pierzchlewicz

Evet, çünkü <ve> arasındaki her şeyi, sizin durumunuzda < 10 <b>ve </b>her ikisi de soyulduğu için.
Bidou

2
Yöntem isimleri Pascal büyük harf kullanması gerektiğinden, yöntem adı StripHtml () olmamalı mı?
David Klempfner

Bunun için normal ifadeler kullanmak, eğer onu güvenlik nedeniyle kullanıyorsanız muhtemelen iyi bir fikir değildir.
Mathias Lykkegaard Lorenzen

3
Sadece normal ifadeyi <[a-zA-Z /] *?> Olarak değiştirin
Brandon Prudent

54

Dizeyi Html Çeviklik paketini kullanarak ayrıştırabilir ve InnerText'i alabilirsiniz.

    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;

InnerTextTüm etiketleri kaldırdığı için çözümü seviyorum . Ama ... geride bırakır &nbsp;ve bu şekilde de açıklama etiketleri <!-- xxx --> çevreleyen olduğu gibi v:shapetype, v:shapeya da v:imagedatabirlikte [if gte vml 1]ya[if !vml]
Thierry_S

7
Bunun &nbsp;bir etiket değil, bir html varlığı olduğunun farkındayım , bu nedenle result = WebUtility.HtmlDecode(result);, Html Çeviklik Paketi'ni kullanarak bu olabilecekleri kaldırmak ve yorum düğümlerini kaldırmak için bir çözüm : htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());yapmadan hemen önceresult = htmlDoc.DocumentNode.InnerText;
Thierry_S

3

Aşağıdaki kodu dizinizde kullanabilirsiniz ve tam dizeyi html kısmı olmadan elde edersiniz.

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);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.