2011-05-03 14 views
19

¿Cuál es la mejor forma de obtener una cadena de texto sin formato de una cadena HTML?Obtenga texto sin formato del HTML en .NET

public string GetPlainText(string htmlString) 
{ 
    // any .NET built in utility? 
} 

Gracias de antemano

+0

¿Qué quiere decir con texto plano? – slandau

+0

@slandau: Quiero imprimir texto legible desde una entrada HTML. No estoy seguro de si algo adicional para eliminar las etiquetas ... –

Respuesta

19

No hay construido en la utilidad por lo que yo sé, pero dependiendo de sus requisitos puede utilizar expresiones regulares que se deben eliminar todas las etiquetas:

string htmlString = @"<p>I'm HTML!</p>"; 
Regex.Replace(htmlString, @"<(.|\n)*?>", ""); 
+3

/me va a ocultar –

+4

mira esta pregunta épica http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml- etiquetas autocontenidas – Andrey

+0

@Andrey Haha es una respuesta bastante impresionante. Afortunadamente, el OP no estableció requisitos exactos ni definió la cadena HTML, por lo que debería capturar la mayoría de los casos HTML reales, en lugar de XHTML. –

1

No hay un método .NET incorporado para hacerlo. Pero, como señaló @rudi_visser, se puede hacer con Expresiones regulares.

Si es necesario eliminar algo más que las etiquetas (es decir, a su vez y ampacirc; a â), se puede utilizar una solución más elaborada, como here encontrado.

5

No hay una solución incorporada en el marco.

Si necesita analizar HTML, tuve una buena experiencia al usar una biblioteca llamada HTML Agility Pack.
Analiza un archivo HTML y proporciona acceso a él por DOM, similar a las clases XML.

30

Puede usar MSHTML, que puede ser bastante indulgente;

//using microsoft.mshtml 
HTMLDocument htmldoc = new HTMLDocument(); 
IHTMLDocument2 htmldoc2 = (IHTMLDocument2)htmldoc; 
htmldoc2.write(new object[] { "<p>Plateau <i>of<i> <b>Leng</b><hr /><b erp=\"arp\">2 sugars please</b> <xxx>what? &amp; who?" }); 

string txt = htmldoc2.body.outerText; 

meseta de Leng 2 azúcares favor qué? & ¿quién?

+0

¡Funciona como un encanto! Debería ser la respuesta aceptada. Tenga en cuenta que primero debe agregar una referencia a 'Microsoft.mshtml.dll'. –

+0

¿Estás seguro de que este método es seguro con HTML de fuentes no confiables? ¿HTMLDocument.Write() ejecuta scripts pasados? –

+0

Esta respuesta es mucho más sólida que la respuesta aceptada (que usa solo expresiones regulares simples para eliminar etiquetas) y es probablemente necesaria para páginas con cualquier complejidad razonable. –

1

Personalmente, encontré una combinación de regex y HttpUtility como la mejor y más breve solución.

Return HttpUtility.HtmlDecode(
       Regex.Replace(HtmlString, "<(.|\n)*?>", "") 
       ) 

Esto elimina todas las etiquetas, y luego decodifica cualquiera de los extras como &lt; o &gt;

Cuestiones relacionadas