2013-02-21 10 views
11

Obecnie pracuję nad konwersją kodów HTML na równoważne znaki w java. Konwertuj poniższy kod na znaki.Zamień kody HTML odpowiednimi znakami w Javie

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

Próbowałem za pomocą wzoru regex

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

Kiedy debugowanie, matcher.find() daje mi true ale kontrola pomija pętlę gdzie ja napisałem kod konwersji. Nie wiem, co się tam dzieje.

Czy istnieje również sposób na zoptymalizowanie tego wyrażenia regularnego?

Każda pomoc jest doceniana.

Wyjątek

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

Jest już odpowiedź :). [Zalecana metoda wychodzenia z HTML w Javie] (http://stackoverflow.com/questions/1265282/recommended-method-for-escaping-html-in-java) –

Odpowiedz

25

też jest jakiś sposób, aby zoptymalizować ten regex?

Tak, nie używać regex dla tego zadania należy użyć Apache StringEscapeUtils z Apache commons lang:

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

JavaDoc mówi:

Unescapes ciąg zawierający jednostkę ucieka na sznurku zawierające rzeczywiste znaki Unicode odpowiadające symbolom ucieczki. Obsługuje encje HTML 4.0.

Na przykład ciąg "&lt;Fran&ccedil;ais&gt;" staną "<Français>"

Jeżeli jednostka jest nierozpoznany, jest on sam, i wstawiony dosłownie do łańcucha wynikowego. na przykład "&gt;&zzzz;x" stanie się ">&zzzz;x".

+0

Wewnętrznie pętle nad przekazanym łańcuchem i użycie double size stringBuffer do zapisz wynik. Prawdopodobnie wstępnie skompilowany zoptymalizowany regex dałby pożądany rezultat z lepszą wydajnością. Co myślisz? :) –

+1

@Quoi: Zawsze użyłbym rozwiązania, które napisałem, chyba że profilowanie pokazałoby, że jest to wąskie gardło pamięci lub środowiska wykonawczego, ale tak się nie działo do tej pory i jestem prawie pewien, że nigdy nie będzie. – jlordo

+0

Otrzymuję NumberFormatException dla ciągu znaków "A & B ' –

1

Jednym z wszystkich innych możliwości lub istniejąca util metod może być wiosna-sieci org.springframework.web.util.HtmlUtils.htmlUnescape.

Przykład użycia w autonomicznym Groovy skryptu:

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