Con ASP.NET, ¿cómo puedo quitar las etiquetas HTML de una cadena determinada de manera confiable (es decir, sin usar expresiones regulares)? Estoy buscando algo como PHP strip_tags
.
Ejemplo:
<ul><li>Hello</li></ul>
Salida:
"Hola"
Estoy tratando de no reinventar la rueda, pero hasta ahora no he encontrado nada que satisfaga mis necesidades.
Respuestas:
Si solo está eliminando todas las etiquetas HTML de una cadena, esto también funciona de
manera confiablecon regex. Reemplazar:con la cadena vacía, globalmente. No olvides normalizar la cadena después, reemplazando:
con un solo espacio, y recortando el resultado. Opcionalmente, reemplace las entidades de caracteres HTML de nuevo a los caracteres reales.
Nota :
>
valores de atributos. Esta solución va a volver marcado rota cuando se enfrentan a tales valores.use un analizador adecuado si debe hacerlo correctamente en todas las circunstancias.
fuente
"e;
. Lo combino conWebUtility.HtmlDecode
eso (que a su vez no eliminará etiquetas). Úselo después de eliminar la etiqueta, ya que puede reescribir>
y<
. Ej .WebUtility.HtmlDecode(Regex.Replace(myTextVariable, "<[^>]*(>|$)", string.Empty))
¡Vaya a descargar HTMLAgilityPack, ahora! ;) Descargar LInk
Esto le permite cargar y analizar HTML. Luego puede navegar por el DOM y extraer los valores internos de todos los atributos. En serio, te llevará unas 10 líneas de código como máximo. Es una de las mejores bibliotecas .net gratuitas que existen.
Aquí hay una muestra:
fuente
text()
nodo, recortar el contenido y la cadena. Únase a aquellos con espacio.IEnumerable<string> allText = doc.DocumentNode.SelectNodes("//text()").Select(n => n.InnerText.Trim())
if (doc == null)
cheque? Esto siempre es falso, ¿no es así?fuente
RegexOptions.SingleLine
.fuente
He publicado esto en los foros de asp.net, y todavía parece ser una de las soluciones más fáciles que existen. No garantizo que sea el más rápido o el más eficiente, pero es bastante confiable. En .NET puede usar los objetos HTML Web Control ellos mismos. Todo lo que realmente necesita hacer es insertar su cadena en un objeto HTML temporal como un DIV, luego use el 'Texto interno' incorporado para capturar todo el texto que no está contenido en las etiquetas. Vea a continuación un ejemplo simple de C #:
fuente
He escrito un método bastante rápido en C # que supera a Regex. Está alojado en un artículo sobre CodeProject.
Sus ventajas son, entre un mejor rendimiento, la capacidad de reemplazar entidades HTML nombradas y numeradas (aquellas como
&amp;
y&203;
) y el reemplazo de bloques de comentarios y más.Lea el artículo relacionado en CodeProject .
Gracias.
fuente
Para aquellos de ustedes que no pueden usar el HtmlAgilityPack, el lector XML .NET es una opción. Sin embargo, esto puede fallar en HTML bien formateado, por lo que siempre debe agregar una captura con regx como copia de seguridad. Tenga en cuenta que esto NO es rápido, pero proporciona una buena oportunidad para el paso de la vieja escuela a través de la depuración.
fuente
fuente
Para aquellos que están cumpliendo con la solución de Michael Tiptop que no funciona, aquí está la forma .Net4 + de hacerlo:
fuente
fuente
He examinado las soluciones basadas en Regex sugeridas aquí, y no me llenan de confianza, excepto en los casos más triviales. Un corchete angular en un atributo es todo lo que se necesitaría para romper, y mucho menos HTML mal formado desde la naturaleza. ¿Y qué hay de las entidades como
&
? Si desea convertir HTML en texto sin formato, también debe decodificar entidades.Así que propongo el siguiente método.
Usando HtmlAgilityPack , este método de extensión elimina eficazmente todas las etiquetas HTML de un fragmento html. También decodifica entidades HTML como
&
. Devuelve solo los elementos de texto interno, con una nueva línea entre cada elemento de texto.Si usted es realmente serio, que querría hacer caso omiso de los contenidos de determinadas etiquetas HTML también (
<script>
,<style>
,<svg>
,<head>
,<object>
vienen a la mente!), Ya que probablemente no contienen contenido legible en el sentido de que estamos buscando. Lo que hagas allí dependerá de tus circunstancias y de cuán lejos quieras llegar, pero usar HtmlAgilityPack sería bastante trivial para incluir en la lista blanca o lista negra las etiquetas seleccionadas.Si está volviendo a procesar el contenido en una página HTML, asegúrese de comprender la vulnerabilidad XSS y cómo prevenirla, es decir, siempre codifique cualquier texto ingresado por el usuario que se vuelva a procesar en una página HTML (se
>
convierte en>
etc.).fuente
Para el segundo parámetro, es decir, mantener algunas etiquetas, es posible que necesite un código como este mediante HTMLagilityPack:
Más explicación en esta página: http://nalgorithm.com/2015/11/20/strip-html-tags-of-an-html-in-c-strip_html-php-equivalent/
fuente
También puede hacer esto con AngleSharp, que es una alternativa a HtmlAgilityPack (no es que HAP sea malo). Es más fácil de usar que HAP para sacar el texto de una fuente HTML.
Puede echar un vistazo a la sección de características clave en la que defienden ser "mejores" que HAP. Creo que, en su mayor parte, probablemente sea excesivo para la pregunta actual, pero aún así, es una alternativa interesante.
fuente
Simplemente use
string.StripHTML();
fuente