Analisei as soluções baseadas em Regex sugeridas aqui e elas não me enchem de confiança, exceto nos casos mais triviais. Um colchete angular em um atributo é tudo o que seria necessário para quebrar, e muito menos HTML malformado. E o que dizer de entidades como&
? Se você deseja converter HTML em texto sem formatação, também é necessário decodificar entidades.
Então, proponho o método abaixo.
Usando HtmlAgilityPack , esse método de extensão remove eficientemente todas as tags HTML de um fragmento html. Também decodifica entidades HTML como &
. Retorna apenas os itens de texto internos, com uma nova linha entre cada item 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();
}
Se você for realmente sério, você iria querer ignorar o conteúdo das etiquetas de certa HTML também ( <script>
, <style>
, <svg>
, <head>
,<object>
vêm à mente!) Porque eles provavelmente não contêm conteúdo legível, no sentido de que são depois. O que você faz lá depende das suas circunstâncias e até onde você deseja ir, mas usar o HtmlAgilityPack seria bastante trivial para colocar as tags selecionadas na lista de permissões ou na lista negra.
Se você estiver renderizando o conteúdo de volta para uma página HTML, certifique-se de entender a vulnerabilidade XSS e como evitá-la - ou seja, sempre codifique qualquer texto inserido pelo usuário que seja renderizado novamente em uma página HTML ( >
torna-se >
etc).