2013-02-21 8 views
11

Attualmente sto lavorando alla conversione di codici HTML con caratteri equivalenti in java. Ho bisogno di convertire il codice seguente in caratteri.Sostituisci codici HTML con caratteri equivalenti in Java

è - è 
® - ® 
& - & 
ñ - ñ 
& - & 

Ho provato ad utilizzare il modello di espressione regolare

(&#x)([\\d|\\w]*)([\\d|\\w]*)([\\d|\\w]*)([\\d|\\w]*)(;) 

Quando il debug, matcher.find() mi dà true ma il controllo salta il ciclo in cui ho scritto il codice per la conversione. Non so cosa sta succedendo lì.

Inoltre, c'è un modo per ottimizzare questo regex?

Qualsiasi aiuto è apprezzato.

Eccezione

java.lang.NumberFormatException: For input string: "x26" 
     at java.lang.NumberFormatException.forInputString(Unknown Source) 
     at java.lang.Integer.parseInt(Unknown Source) 
     at java.lang.Integer.parseInt(Unknown Source) 
     at org.apache.commons.lang.Entities.unescape(Entities.java:683) 
     at org.apache.commons.lang.StringEscapeUtils.unescapeHtml(StringEscapeUtils.java:483) 
+2

E 'già una risposta :). [Metodo consigliato per l'escape dell'HTML in Java] (http://stackoverflow.com/questions/1265282/recommended-method-for-escaping-html-in-java) –

risposta

25

Inoltre, non v'è alcun modo per ottimizzare questo regex?

Sì, non utilizzare regex per questo compito, utilizzare Apache StringEscapeUtils da Apache commons lang:

import org.apache.commons.lang.StringEscapeUtils; 
... 
String withCharacters = StringEscapeUtils.unescapeHtml(yourString); 

JavaDoc dice:

sequenza non di escape una stringa contenente un'entità sfugge ad una stringa contenente i caratteri Unicode effettivi corrispondenti agli escape. Supporta le entità HTML 4.0 .

Ad esempio, la stringa "&lt;Fran&ccedil;ais&gt;" diventerà "<Français>"

Se l'entità è riconosciuto, è lasciato da solo, e incorporato alla lettera nella stringa risultato. per esempio. "&gt;&zzzz;x" diventerà ">&zzzz;x".

+0

Internamente esegue il loop sulla stringa passata e usa double string stringer su memorizzare il risultato. Forse una regex ottimizzata pre-compilata ti darebbe il risultato desiderato con prestazioni migliori. Cosa ne pensi? :) –

+1

@Quoi: utilizzerei sempre la soluzione che ho postato, a meno che la profilazione non indichi che si tratta di un collo di bottiglia di memoria o di runtime, ma non è mai stato così fino ad ora e sono quasi certo che non lo sarà mai. – jlordo

+0

Ricevo NumberFormatException per la stringa "A & B" –

1

Uno di tutte le altre possibilità o util metodi esistenti potrebbe essere primavera-web di org.springframework.web.util.HtmlUtils.htmlUnescape.

Esempio di utilizzo in uno script Groovy autonomo:

@Grapes(
    @Grab(group='org.springframework', module='spring-web', version='4.3.0.RELEASE') 
) 
import org.springframework.web.util.HtmlUtils 

println HtmlUtils.htmlUnescape("La &#xE9;lite del tenis no teme al zika y jugar&#xE1; en R&#xED;o") 
Problemi correlati