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.
public static string RemoveHtmlTags(this string html)
{
if (String.IsNullOrEmpty(html))
return html;
var doc = new HtmlAgilityPack.HtmlDocument();
doc.LoadHtml(html);
if (doc.DocumentNode == null || doc.DocumentNode.ChildNodes == null)
{
return WebUtility.HtmlDecode(html);
}
var sb = new StringBuilder();
var i = 0;
foreach (var node in doc.DocumentNode.ChildNodes)
{
var text = node.InnerText.SafeTrim();
if (!String.IsNullOrEmpty(text))
{
sb.Append(text);
if (i < doc.DocumentNode.ChildNodes.Count - 1)
{
sb.Append(Environment.NewLine);
}
}
i++;
}
var result = sb.ToString();
return WebUtility.HtmlDecode(result);
}
public static string SafeTrim(this string str)
{
if (str == null)
return null;
return str.Trim();
}
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.).