Come faccio a rimuovere tutti i tag HTML da una stringa senza sapere quali tag ci sono?


122

Esiste un modo semplice per rimuovere tutti i tag HTML o QUALSIASI COSA HTML correlata da una stringa?

Per esempio:

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

Quanto sopra dovrebbe davvero essere:

"Hulk Hogan's Celebrity Championship Wrestling [Proj # 206010] (Reality Series)"


Questa domanda è stata chiusa a causa della duplicazione, ma la risposta suggerita viene data utilizzando Html Agility Pack. Se desideri rimuovere i tag html senza utilizzare Html Agility Pack, puoi fare riferimento alla mia risposta qui stackoverflow.com/a/30026043/2318354 . Il che potrebbe essere utile a qualcuno
Dilip0165

6
Questo non è un duplicato, come "HTML agility pack - rimuovere i tag indesiderati senza rimuovere il contenuto?" vuole mantenere alcuni tag (ad esempio, fornire un elenco di tag validi, rimuovere il resto). Questa domanda qui riguarda la rimozione di TUTTI i tag. E non posso usare le risposte dell'altra domanda in quanto non ho intenzione di passare in un elenco di tutti i tag html esistenti.
Thierry_S

Dai un'occhiata a xidel . Ti ci vorrà il 95% del percorso xidel -s input -e '/'.
Josh Habdas

Risposte:


247

Puoi usare una semplice regex come questa:

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

Tieni presente che questa soluzione ha il suo difetto. Vedi Rimuovere i tag HTML in String per ulteriori informazioni (in particolare i commenti di @mehaase)

Un'altra soluzione potrebbe essere quella di utilizzare l' HTML Agility Pack .
Puoi trovare un esempio utilizzando la libreria qui: HTML agility pack - rimuovere i tag indesiderati senza rimuovere il contenuto?


2
Non funziona per l'input: "7 <10 <b> ma </b> 30> 10" restituisce: "7 ma 30> 10"
Bartosz Pierzchlewicz

Sì, perché rimuove tutto ciò che si trova tra <e>, quindi nel tuo caso, < 10 <b>e </b>vengono entrambi spogliati.
Bidou

2
Il nome del metodo non dovrebbe essere StripHtml () poiché i nomi dei metodi dovrebbero usare il caso Pascal?
David Klempfner

L'uso di espressioni regolari per questo probabilmente non è una buona idea se lo si utilizza per motivi di sicurezza.
Mathias Lykkegaard Lorenzen

3
Basta cambiare la regex in <[a-zA-Z /] *?>
Brandon Prudent

54

Puoi analizzare la stringa usando Html Agility pack e ottenere 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;

Mi piace la InnerTextsoluzione in quanto rimuove tutti i tag. Ma ... lascia dietro di sé &nbsp;e commenta anche tag <!-- xxx --> come quelli circostanti v:shapetype, v:shapeo v:imagedatacon [if gte vml 1]o[if !vml]
Thierry_S

7
Mi rendo conto che &nbsp;è un'entità html, non un tag, quindi una soluzione per rimuoverla potrebbe essere result = WebUtility.HtmlDecode(result);e per rimuovere i nodi di commento, utilizzando l'Html Agility Pack: htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());appena prima di fareresult = htmlDoc.DocumentNode.InnerText;
Thierry_S

3

Puoi usare il codice seguente sulla tua stringa e otterrai la stringa completa senza la parte 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);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.