Como faço para remover todas as tags HTML de uma string sem saber quais tags estão nela?

121

Existe alguma maneira fácil de remover todas as tags HTML ou QUALQUER COISA HTML relacionada de uma string?

Por exemplo:

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

O acima deve realmente ser:

"Wrestling no campeonato de celebridades de Hulk Hogan [Proj # 206010] (Reality Series)"

RJ.
fonte
Esta pergunta foi encerrada devido à duplicação, mas a resposta sugerida é fornecida usando o Html Agility Pack. Se você deseja remover as tags html sem usar o pacote Agility Html, consulte a minha resposta aqui stackoverflow.com/a/30026043/2318354 . Que pode ser útil a alguém
Dilip0165
6
Isso não é duplicado, como "pacote de agilidade HTML - removendo tags indesejadas sem remover o conteúdo?" deseja manter algumas tags (ou seja, forneça uma lista de tags válidas, remova o restante). Esta pergunta aqui é sobre a remoção de TODAS as tags. E não posso usar as respostas da outra pergunta, pois não vou passar uma lista de todas as tags html existentes.
Thierry_S
Dê uma olhada no xidel . Você levará 95% do caminho até lá xidel -s input -e '/'.
Josh Habdas 24/04

Respostas:

245

Você pode usar um regex simples como este:

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

Esteja ciente de que esta solução tem sua própria falha. Consulte Remover tags HTML em String para obter mais informações (especialmente os comentários de @mehaase)

Outra solução seria usar o HTML Agility Pack .
Você pode encontrar um exemplo usando a biblioteca aqui: Pacote de agilidade HTML - removendo tags indesejadas sem remover o conteúdo?

Bidou
fonte
2
Não funciona para entrada: '7 <10 <b> mas </b> 30> 10' fornece: '7 mas 30> 10'
Bartosz Pierzchlewicz
Sim, porque retira tudo entre <e>, no seu caso, < 10 <b>e </b>são removidos.
Bidou
2
O nome do método não deve ser StripHtml (), pois os nomes dos métodos devem usar o caso Pascal?
David Klempfner 28/04/19
Usar expressões regulares para isso provavelmente não é uma boa ideia se você estiver usando por motivos de segurança.
Mathias Lykkegaard Lorenzen
3
Basta alterar o regex para <[a-zA-Z /] *?>
Brandon Prudent
54

Você pode analisar a string usando o pacote Agility Html e obter o 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
fonte
Eu gosto da InnerTextsolução, pois remove todas as tags. Mas ... que deixa para trás &nbsp;e também marcas de comentário, como <!-- xxx --> como aqueles que rodeiam v:shapetype, v:shapeou v:imagedatacom [if gte vml 1]ou[if !vml]
Thierry_S
7
Sei que &nbsp;é uma entidade html, e não uma tag, por isso, uma solução para remover que poderia ser result = WebUtility.HtmlDecode(result);e para remover os nós de comentário, usando a agilidade Pacote Html: htmlDoc.DocumentNode.SelectNodes("//comment()")?.ForEach(c=> c.Remove());pouco antes de fazerresult = htmlDoc.DocumentNode.InnerText;
Thierry_S
3

Você pode usar o código abaixo na sua string e obterá a string completa sem a 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
fonte