Usando o ASP.NET, como posso retirar as tags HTML de uma determinada string de maneira confiável (ou seja, não usando regex)? Eu estou procurando algo como PHP strip_tags
.
Exemplo:
<ul><li>Hello</li></ul>
Resultado:
"Olá"
Estou tentando não reinventar a roda, mas ainda não encontrei nada que atenda às minhas necessidades.
Respostas:
Se estiver apenas retirando todas as tags HTML de uma sequência, isso funcionará de
maneira confiável tambémcom o regex. Substituir:com a cadeia vazia, globalmente. Não se esqueça de normalizar a sequência posteriormente, substituindo:
com um único espaço e aparando o resultado. Opcionalmente, substitua quaisquer entidades de caracteres HTML de volta aos caracteres reais.
Nota :
>
valores de atributo. Esta solução irá retornar marcação quebrado quando se deparam com tais valores.use um analisador adequado se você precisar corrigi-lo em todas as circunstâncias.
fonte
"e;
. Eu o combino comWebUtility.HtmlDecode
isso (o que, por sua vez, não remove as tags). Use-o após a remoção da tag, pois pode reescrever>
e<
. ExemploWebUtility.HtmlDecode(Regex.Replace(myTextVariable, "<[^>]*(>|$)", string.Empty))
Vá baixar HTMLAgilityPack, agora! ;) Baixar LInk
Isso permite carregar e analisar o HTML. Em seguida, você pode navegar pelo DOM e extrair os valores internos de todos os atributos. Sério, você levará cerca de 10 linhas de código no máximo. É uma das maiores bibliotecas .net gratuitas disponíveis no mercado.
Aqui está uma amostra:
fonte
text()
nós, aparar o conteúdo e a string.IEnumerable<string> allText = doc.DocumentNode.SelectNodes("//text()").Select(n => n.InnerText.Trim())
if (doc == null)
cheque? Isso é sempre falso, não é?fonte
RegexOptions.SingleLine
.fonte
Eu publiquei isso nos fóruns do asp.net, e ainda parece ser uma das soluções mais fáceis por aí. Não garanto que seja o mais rápido ou mais eficiente, mas é bastante confiável. No .NET, você pode usar os próprios objetos HTML Web Control. Tudo o que você realmente precisa fazer é inserir sua string em um objeto HTML temporário, como um DIV, e usar o 'InnerText' interno para capturar todo o texto que não está contido nas tags. Veja abaixo um exemplo simples de C #:
fonte
Eu escrevi um método bastante rápido em c # que supera o Regex. Está hospedado em um artigo no CodeProject.
Suas vantagens são, entre melhor desempenho, a capacidade de substituir entidades HTML nomeadas e numeradas (aquelas como
&amp;
e&203;
) e substituir blocos de comentários e muito mais.Por favor, leia o artigo relacionado no CodeProject .
Obrigado.
fonte
Para aqueles que não podem usar o HtmlAgilityPack, o leitor XML do .NETs é uma opção. Isso pode falhar em HTML bem formatado, portanto, sempre adicione uma captura com o regx como um backup. Observe que isso NÃO é rápido, mas fornece uma boa oportunidade para a etapa da velha escola na depuração.
fonte
fonte
Para aqueles que estão se queixando de que a solução de Michael Tiptop não está funcionando, aqui está a maneira .Net4 + de fazer isso:
fonte
fonte
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.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).fonte
Para o segundo parâmetro, ou seja, mantenha algumas tags, você pode precisar de um código como este usando HTMLagilityPack:
Mais explicações nesta página: http://nalgorithm.com/2015/11/20/strip-html-tags-of-an-html-in-c-strip_html-php-equivalent/
fonte
Você também pode fazer isso com o AngleSharp, que é uma alternativa ao HtmlAgilityPack (não que o HAP seja ruim). É mais fácil usar do que o HAP para obter o texto de uma fonte HTML.
Você pode dar uma olhada na seção de recursos principais , na qual eles afirmam ser "melhores" que o HAP. Eu acho que, na maior parte, provavelmente é um exagero para a pergunta atual, mas ainda assim, é uma alternativa interessante.
fonte
Basta usar
string.StripHTML();
fonte