Existe uma boa maneira de remover HTML de uma string Java? Uma regex simples como
replaceAll("\\<.*?>","")
funcionará, mas coisas como &
não serão convertidas corretamente e o HTML entre os dois colchetes angulares será removido (ou seja, o .*?
no regex desaparecerá).
Respostas:
Use um analisador de HTML em vez de regex. Isso é muito simples com o Jsoup .
O Jsoup também suporta a remoção de tags HTML em uma lista branca personalizável, o que é muito útil se você deseja permitir apenas
<b>
, por exemplo ,<i>
e<u>
.Veja também:
fonte
Jsoup#clean()
.<p>Lorem ipsum 1 < 3 dolor sit amet</p>
. Novamente, HTML não é uma linguagem comum . Está completamente além de mim que todo mundo tenta lançar regex nele para analisar partes de interesse em vez de usar um analisador real.Jsoup.clean(unsafeString, "", Whitelist.none(), new OutputSettings().prettyPrint(false));
para preservar quebras de linhaSe você está escrevendo para Android, pode fazer isso ...
fonte
Se o usuário entrar
<b>hey!</b>
, você deseja exibir<b>hey!</b>
ouhey!
? Se o primeiro, escapar de e menos que e codificar html (e opcionalmente aspas) e você está bem. Uma modificação no seu código para implementar a segunda opção seria:mas você terá problemas se o usuário inserir algo malformado, como
<bhey!</b>
.Você também pode verificar o JTidy, que analisará a entrada html "suja" e deve fornecer uma maneira de remover as tags, mantendo o texto.
O problema ao tentar remover o html é que os navegadores têm analisadores muito branda, mais branda do que qualquer biblioteca que você encontrar, portanto, mesmo se você fizer o melhor para remover todas as tags (usando o método de substituição acima, uma biblioteca DOM ou JTidy) , você ainda precisará codificar os caracteres especiais HTML restantes para manter sua saída segura.
fonte
Outra maneira é usar o javax.swing.text.html.HTMLEditorKit para extrair o texto.
ref: remova tags HTML de um arquivo para extrair apenas o texto
fonte
Eu acho que a maneira mais simples de filtrar as tags html é:
fonte
Também é muito simples usando Jericó , e você pode reter parte da formatação (quebras de linha e links, por exemplo).
fonte
A resposta aceita de fazer simplesmente
Jsoup.parse(html).text()
tem 2 problemas em potencial (com JSoup 1.7.3):<script>
em<script>
Se você usar isso para se proteger do XSS, isso é um pouco chato. Aqui está minha melhor chance de uma solução aprimorada, usando JSoup e Apache StringEscapeUtils:
Observe que o último passo é porque eu preciso usar a saída como texto sem formatação. Se você precisar apenas de saída HTML, poderá removê-la.
E aqui estão alguns casos de teste (entrada para saída):
Se você encontrar uma maneira de melhorar, informe-me.
fonte
&lt;script&gt;alert('Evil script executed');&lt;/script&gt;
. O mesmo vale para&
. O JSoup não converte<script> into <script>
, é o que faz porque você chamaStringEscapeUtils.unescapeHtml
depois que o JSoup limpa a entrada.No Android, tente o seguinte:
fonte
Escapar de HTML é realmente difícil de fazer o certo - eu definitivamente sugeriria usar o código da biblioteca para fazer isso, pois é muito mais sutil do que você imagina. Confira o StringEscapeUtils do Apache para obter uma biblioteca muito boa para lidar com isso em Java.
fonte
Isso deve funcionar -
usa isto
e isto
fonte
Convém substituir
<br/>
e</p>
marcar com novas linhas antes de remover o HTML para evitar que ele se torne uma bagunça ilegível, como Tim sugere.A única maneira de pensar em remover tags HTML, mas deixar não HTML entre colchetes angulares, seria comparar uma lista de tags HTML . Algo nesse sentido ...
Em seguida, decodifique caracteres especiais como HTML
&
. O resultado não deve ser considerado higienizado.fonte
Como alternativa, pode-se usar o HtmlCleaner :
fonte
A resposta aceita não funcionou para mim no caso de teste que eu indiquei: o resultado de "a <b ou b> c" é "ab ou b> c".
Então, eu usei o TagSoup. Aqui está uma foto que funcionou para o meu caso de teste (e mais alguns):
fonte
Eu sei que isso é antigo, mas eu estava trabalhando em um projeto que exigia a filtragem de HTML e isso funcionou bem:
em vez disso:
fonte
Aqui está uma atualização levemente mais detalhada para tentar lidar com alguma formatação de pausas e listas. Eu usei a saída de Amaya como um guia.
fonte
Usar
Html.fromHtml
Tags HTML são
De acordo com as Documentações oficiais do Android, qualquer tag no HTML será exibida como uma String genérica de substituição, que o seu programa poderá passar e substituir por strings reais .
Html.formHtml
O método leva umHtml.TagHandler
e um Html.ImageGetter como argumentos, bem como o texto para analisar.Exemplo
Então
Resultado
Trata-se de um texto que o usuário pode colocar em seu perfil
fonte
Aqui está mais uma variante de como substituir tudo (Tags HTML | Entidades HTML | Espaço vazio no conteúdo HTML)
content.replaceAll("(<.*?>)|(&.*?;)|([ ]{2,})", "");
onde o conteúdo é uma String.fonte
Você pode simplesmente usar o filtro HTML padrão do Android
O método acima retornará a string filtrada em HTML para sua entrada.
fonte
Mais uma maneira pode ser usar a classe com.google.gdata.util.common.html.HtmlToText como
Porém, este não é um código à prova de balas e, quando o executo nas entradas da Wikipedia, também estou recebendo informações de estilo. No entanto, acredito que para trabalhos pequenos / simples isso seria eficaz.
fonte
Parece que você deseja ir do HTML para o texto sem formatação.
Se for esse o caso, consulte www.htmlparser.org. Aqui está um exemplo que retira todas as tags do arquivo html encontrado em uma URL.
Ele usa org.htmlparser.beans.StringBean .
fonte
Aqui está outra maneira de fazer isso:
fonte
Pode-se também usar o Apache Tika para esse fim. Por padrão, ele preserva os espaços em branco do html removido, o que pode ser desejado em determinadas situações:
fonte
Parse.parse(InputStream, ContentHandler, Metadata, ParseContext)
.Uma maneira de reter informações de nova linha com JSoup é preceder todas as novas tags de linha com alguma sequência fictícia, executar JSoup e substituir a seqüência fictícia por "\ n".
fonte
fonte
Meus 5 centavos:
fonte
Para obter texto html simples formatado, você pode fazer isso:
Para obter o texto sem formatação, altere <br/> por \ n e altere a última linha por:
fonte
Eu sei que já faz um tempo desde que essa pergunta foi feita, mas encontrei outra solução, e foi isso que funcionou para mim:
fonte
você pode simplesmente criar um método com vários replaceAll () como
Use este link para as substituições mais comuns que você precisa: http://tunes.org/wiki/html_20special_20characters_20and_20symbols.html
É simples, mas eficaz. Eu uso esse método primeiro para remover o lixo eletrônico, mas não a primeira linha, ou seja, replaceAll ("\ <. *?>", "") E, posteriormente, uso palavras-chave específicas para pesquisar índices e, em seguida, usar .substring (start, end ) para remover coisas desnecessárias. Como isso é mais robusto e você pode apontar exatamente o que precisa em toda a página html.
fonte
Remova as tags HTML da string. Em algum lugar, precisamos analisar alguma string que é recebida por algumas respostas como Httpresponse do servidor.
Então, precisamos analisá-lo.
Aqui vou mostrar como remover tags html da string.
fonte
new System.Text.RegularExpressions.Regex();
vem?