¿Cómo elimino todas las etiquetas HTML de una cadena sin saber qué etiquetas contiene?

122

¿Existe alguna forma sencilla de eliminar todas las etiquetas HTML o CUALQUIER COSA relacionada con HTML de una cadena?

Por ejemplo:

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

Lo anterior realmente debería ser:

"Lucha por el campeonato de celebridades de Hulk Hogan [Proj # 206010] (Reality Series)"

RJ.
fuente
Esta pregunta está cerrada debido a la duplicación, pero la respuesta sugerida se da usando Html Agility Pack. Si desea eliminar las etiquetas html sin usar el paquete Html Agility, puede consultar mi respuesta aquí stackoverflow.com/a/30026043/2318354 . Lo que puede ser útil para alguien
Dilip0165
6
Esto no es un duplicado, como "Paquete de agilidad HTML: ¿eliminar etiquetas no deseadas sin eliminar contenido?" quiere conservar algunas etiquetas (es decir, dar una lista de etiquetas válidas, eliminar el resto). Esta pregunta trata sobre la eliminación de TODAS las etiquetas. Y no puedo usar las respuestas de la otra pregunta ya que no voy a pasar una lista de todas las etiquetas html existentes.
Thierry_S
Eche un vistazo a xidel . Te llevará el 95% del camino xidel -s input -e '/'.
Josh Habdas

Respuestas:

247

Puede usar una expresión regular simple como esta:

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

Tenga en cuenta que esta solución tiene sus propios defectos. Consulte Eliminar etiquetas HTML en String para obtener más información (especialmente los comentarios de @mehaase)

Otra solución sería utilizar HTML Agility Pack .
Puede encontrar un ejemplo usando la biblioteca aquí: Paquete de agilidad HTML : ¿eliminar etiquetas no deseadas sin eliminar contenido?

Bidou
fuente
2
No funciona para la entrada: '7 <10 <b> pero </b> 30> 10' da: '7 pero 30> 10'
Bartosz Pierzchlewicz
Sí, porque elimina todo entre <y>, por lo que en su caso, < 10 <b>y </b>ambos se eliminan.
Bidou
2
¿No debería ser el nombre del método StripHtml () ya que los nombres de los métodos deberían usar el caso Pascal?
David Klempfner
El uso de expresiones regulares para esto probablemente no sea una buena idea si lo está usando por razones de seguridad.
Mathias Lykkegaard Lorenzen
3
Simplemente cambie la expresión regular a <[a-zA-Z /] *?>
Brandon Prudent
54

Puede analizar la cadena utilizando el paquete Html Agility y obtener el 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
fuente
Me gusta la InnerTextsolución ya que elimina todas las etiquetas. Pero ... deja atrás &nbsp;y también comentarios etiquetas <!-- xxx --> como las que rodean v:shapetype, v:shapeo v:imagedatacon [if gte vml 1]o[if !vml]
Thierry_S
7
Me doy cuenta de que &nbsp;es una entidad html, no una etiqueta, por lo que una solución para eliminar eso podría ser result = WebUtility.HtmlDecode(result);y eliminar los nodos de comentarios, usando Html Agility Pack: htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());justo antes de hacerloresult = htmlDoc.DocumentNode.InnerText;
Thierry_S
3

Puede usar el siguiente código en su cadena y obtendrá la cadena completa sin 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);
Vinay
fuente