Jak usunąć wszystkie tagi HTML z ciągu znaków, nie wiedząc, które tagi się w nim znajdują?


122

Czy istnieje łatwy sposób na usunięcie wszystkich tagów HTML lub WSZYSTKIEGO związanego z HTML z ciągu znaków?

Na przykład:

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

Tak naprawdę powinno to być:

„Hulk Hogan's Celebrity Championship Wrestling [Proj # 206010] (seria Reality)”


To pytanie zostało zamknięte ze względu na powielanie, ale sugerowana odpowiedź jest udzielana za pomocą pakietu Html Agility Pack. Jeśli chcesz usunąć tagi HTML bez korzystania z pakietu Agility HTML, możesz skierować moją odpowiedź tutaj stackoverflow.com/a/30026043/2318354 . Co może być pomocne dla kogoś
Dilip0165

6
To nie jest duplikat, ponieważ „pakiet HTML agility - usuwanie niechcianych tagów bez usuwania treści?” chce zachować niektóre tagi (tj. podać listę prawidłowych tagów, usunąć resztę). To pytanie dotyczy usunięcia WSZYSTKICH tagów. I nie mogę użyć odpowiedzi na drugie pytanie, ponieważ nie zamierzam przekazać listy wszystkich istniejących tagów HTML.
Thierry_S

Spójrz na Xidel . Zajmie ci to 95% drogi xidel -s input -e '/'.
Josh Habdas

Odpowiedzi:


247

Możesz użyć prostego wyrażenia regularnego, takiego jak ten:

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

Pamiętaj, że to rozwiązanie ma swoją wadę. Aby uzyskać więcej informacji (zwłaszcza komentarze @mehaase), zobacz Usuwanie tagów HTML w ciągu znaków

Innym rozwiązaniem byłoby użycie pakietu HTML Agility Pack .
Przykład użycia biblioteki można znaleźć tutaj: Pakiet zwinności HTML - usuwanie niechcianych tagów bez usuwania treści?


2
Nie działa przy wejściu: „7 <10 <b> ale </b> 30> 10” daje: „7 ale 30> 10”
Bartosz Pierzchlewicz

Tak, ponieważ usuwa wszystko między <i>, a więc w twoim przypadku, < 10 <b>i </b>oba są usuwane.
Bidou

2
Czy nazwą metody nie powinno być StripHtml (), ponieważ nazwy metod powinny używać wielkości liter w języku Pascal?
David Klempfner

Używanie do tego wyrażeń regularnych prawdopodobnie nie jest dobrym pomysłem, jeśli używasz go ze względów bezpieczeństwa.
Mathias Lykkegaard Lorenzen

3
Po prostu zmień wyrażenie regularne na <[a-zA-Z /] *?>
Brandon Prudent

54

Możesz przeanalizować ciąg przy użyciu pakietu Html Agility i pobrać 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;

Podoba mi się to InnerTextrozwiązanie, ponieważ usuwa wszystkie tagi. Ale ... zostawia za sobą &nbsp;i komentuje tagi, takie <!-- xxx --> jak te otaczające v:shapetype, v:shapelub v:imagedataz [if gte vml 1]lub[if !vml]
Thierry_S

7
Zdaję sobie sprawę, że &nbsp;jest to encja html, a nie tag, więc rozwiązanie do usunięcia tego może być result = WebUtility.HtmlDecode(result);i usunięcia węzłów komentarzy, używając Html Agility Pack: htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());tuż przed zrobieniemresult = htmlDoc.DocumentNode.InnerText;
Thierry_S

3

Możesz użyć poniższego kodu na swoim ciągu, a otrzymasz kompletny ciąg bez części 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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.