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


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?


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;

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);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.