Retira o escape de uma string que contém uma entidade que escapa para uma string que contém os caracteres Unicode reais correspondentes às fugas. Suporta entidades HTML 4.0.
Eu quero converter a string <p>üè</p>para <p>üé</p>, com StringEscapeUtils.unescapeHtml4()eu recebo <p>üè</p>. Existe uma maneira de manter intactas as tags html existentes?
Nickkk 13/01
48
As bibliotecas mencionadas em outras respostas seriam ótimas soluções, mas se você já está pesquisando html do mundo real em seu projeto, o Jsoupprojeto tem muito mais a oferecer do que apenas gerenciar coisas de "e comercial e ponto-e-vírgula FFFF" .
// textValue: <p>This is a sample. \"Granny\" Smith –.<\/p>\r\n// becomes this: This is a sample. "Granny" Smith –.// with one line of code:// Jsoup.parse(textValue).getText(); // for older versions of JsoupJsoup.parse(textValue).text();// Another possibility may be the static unescapeEntities method:boolean strictMode =true;String unescapedString = org.jsoup.parser.Parser.unescapeEntities(textValue, strictMode);
E você também obtém a API conveniente para extrair e manipular dados, usando o melhor dos métodos DOM, CSS e do tipo jquery. É de código aberto e licença MIT.
upvote +, mas devo apontar que versões mais recentes do Jsoup usam em .text()vez de.getText()
SourceVisor
4
Talvez mais direto seja o uso org.jsoup.parser.Parser.unescapeEntities(String string, boolean inAttribute). Documentos da API: jsoup.org/apidocs/org/jsoup/parser/…
danneu
3
Isso foi perfeito, já que eu já estou usando o Jsoup no meu projeto. Além disso, @danneu estava certa - Parser.unescapeEntities funciona exatamente como anunciado.
precisa saber é o seguinte
42
Tentei o Apache Commons StringEscapeUtils.unescapeHtml3 () no meu projeto, mas não estava satisfeito com seu desempenho. Acontece que ele faz muitas operações desnecessárias. Por um lado, ele aloca um StringWriter para todas as chamadas, mesmo que não haja nada a ser retirado da string. Eu reescrevi esse código de maneira diferente, agora ele funciona muito mais rápido. Quem encontrar isso no google, poderá usá-lo.
O código a seguir remove todos os símbolos HTML 3 e escapes numéricos (equivalente ao Apache unescapeHtml3). Você pode adicionar mais entradas ao mapa se precisar do HTML 4.
Recentemente, tive que otimizar um projeto lento do Struts. Acontece que, sob a capa, o Struts chama o Apache por string html escapando por padrão ( <s:property value="..."/>). Ao desativar o escape ( <s:property value="..." escaping="false"/>), algumas páginas são executadas 5% a 20% mais rapidamente.
Stephan
Mais tarde, descobri que esse código pode entrar em loop quando recebe uma string vazia como argumento. A edição atual tem esse problema corrigido.
Nick Frolov
Isso escapa ou não é espaço? & amp; não é decodificado. Somente & é adicionado ao mapa, portanto, funciona apenas de uma maneira?
mmm
3
Um StringWriter usa um StringBuffer internamente que usa bloqueio. Usar um StringBuilder diretamente deve ser mais rápido.
Axel Dörfler 22/02
4
@NickFrolov, seus comentários parecem um pouco confusos. aumlé por exemplo äe não д.
aioobe
12
A seguinte biblioteca também pode ser usada para escape de HTML em Java: unbescape .
Isso não fez nada:%3Chtml%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3Etest%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%3E%0D%0Atest%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E
ThreaT 27/08/2015
40
@ ThreaT Seu texto não é codificado em html, é url.
Considere usar a classe Java HtmlManipulator . Pode ser necessário adicionar alguns itens (nem todas as entidades estão na lista).
O Apache Commons StringEscapeUtils, como sugerido por Kevin Hakanson, não funcionou 100% para mim; várias entidades como & # 145 (aspas simples à esquerda) foram traduzidas para '222' de alguma forma. Eu também tentei o org.jsoup e tive o mesmo problema.
No meu caso, eu uso o método de substituição testando todas as entidades em todas as variáveis, meu código fica assim:
text = text.replace("Ç","Ç");
text = text.replace("ç","ç");
text = text.replace("Á","Á");
text = text.replace("Â","Â");
text = text.replace("Ã","Ã");
text = text.replace("É","É");
text = text.replace("Ê","Ê");
text = text.replace("Í","Í");
text = text.replace("Ô","Ô");
text = text.replace("Õ","Õ");
text = text.replace("Ó","Ó");
text = text.replace("Ú","Ú");
text = text.replace("á","á");
text = text.replace("â","â");
text = text.replace("ã","ã");
text = text.replace("é","é");
text = text.replace("ê","ê");
text = text.replace("í","í");
text = text.replace("ô","ô");
text = text.replace("õ","õ");
text = text.replace("ó","ó");
text = text.replace("ú","ú");
Esta não é toda entidade especial. Até os dois mencionados na pergunta estão ausentes.
Sandy Gifford
isso não será bem dimensionado
denov 03/01/19
-7
Caso queira imitar qual função php htmlspecialchars_decode usa a função php get_html_translation_table () para despejar a tabela e usar o código java como,
staticMap<String,String> html_specialchars_table =newHashtable<String,String>();static{
html_specialchars_table.put("<","<");
html_specialchars_table.put(">",">");
html_specialchars_table.put("&","&");}staticString htmlspecialchars_decode_ENT_NOQUOTES(String s){Enumeration en = html_specialchars_table.keys();while(en.hasMoreElements()){String key = en.nextElement();String val = html_specialchars_table.get(key);
s = s.replaceAll(key, val);}return s;}
Respostas:
Eu usei o Apache Commons StringEscapeUtils.unescapeHtml4 () para isso:
fonte
<p>üè</p>
para<p>üé</p>
, comStringEscapeUtils.unescapeHtml4()
eu recebo<p>üè</p>
. Existe uma maneira de manter intactas as tags html existentes?As bibliotecas mencionadas em outras respostas seriam ótimas soluções, mas se você já está pesquisando html do mundo real em seu projeto, o
Jsoup
projeto tem muito mais a oferecer do que apenas gerenciar coisas de "e comercial e ponto-e-vírgula FFFF" .E você também obtém a API conveniente para extrair e manipular dados, usando o melhor dos métodos DOM, CSS e do tipo jquery. É de código aberto e licença MIT.
fonte
.text()
vez de.getText()
org.jsoup.parser.Parser.unescapeEntities(String string, boolean inAttribute)
. Documentos da API: jsoup.org/apidocs/org/jsoup/parser/…Tentei o Apache Commons StringEscapeUtils.unescapeHtml3 () no meu projeto, mas não estava satisfeito com seu desempenho. Acontece que ele faz muitas operações desnecessárias. Por um lado, ele aloca um StringWriter para todas as chamadas, mesmo que não haja nada a ser retirado da string. Eu reescrevi esse código de maneira diferente, agora ele funciona muito mais rápido. Quem encontrar isso no google, poderá usá-lo.
O código a seguir remove todos os símbolos HTML 3 e escapes numéricos (equivalente ao Apache unescapeHtml3). Você pode adicionar mais entradas ao mapa se precisar do HTML 4.
fonte
<s:property value="..."/>
). Ao desativar o escape (<s:property value="..." escaping="false"/>
), algumas páginas são executadas 5% a 20% mais rapidamente.auml
é por exemploä
e nãoд
.A seguinte biblioteca também pode ser usada para escape de HTML em Java: unbescape .
O HTML pode ser sem escape da seguinte maneira:
fonte
%3Chtml%3E%0D%0A%3Chead%3E%0D%0A%3Ctitle%3Etest%3C%2Ftitle%3E%0D%0A%3C%2Fhead%3E%0D%0A%3Cbody%3E%0D%0Atest%0D%0A%3C%2Fbody%3E%0D%0A%3C%2Fhtml%3E
Isso fez o trabalho para mim,
ou
Eu acho que é sempre melhor usar o
lang3
por razões óbvias. Espero que isto ajude :)fonte
Uma solução muito simples, mas ineficiente, sem qualquer biblioteca externa, é:
Isso deve ser usado apenas se você tiver apenas uma pequena contagem de cadeias para decodificar.
fonte
A maneira mais confiável é com
de
org.apache.commons.lang3.StringEscapeUtils
.E para escapar dos espaços em branco
Isso garantirá que os espaços em branco devidos para copiar e colar nos formulários da web não sejam persistidos no banco de dados.
fonte
Spring Framework HtmlUtils
Se você já estiver usando o framework Spring, use o seguinte método:
fonte
Considere usar a classe Java HtmlManipulator . Pode ser necessário adicionar alguns itens (nem todas as entidades estão na lista).
O Apache Commons StringEscapeUtils, como sugerido por Kevin Hakanson, não funcionou 100% para mim; várias entidades como & # 145 (aspas simples à esquerda) foram traduzidas para '222' de alguma forma. Eu também tentei o org.jsoup e tive o mesmo problema.
fonte
No meu caso, eu uso o método de substituição testando todas as entidades em todas as variáveis, meu código fica assim:
No meu caso, isso funcionou muito bem.
fonte
Caso queira imitar qual função php htmlspecialchars_decode usa a função php get_html_translation_table () para despejar a tabela e usar o código java como,
fonte