5

次の形式のメソッドが必要です。

public boolean isValidHtmlEscapeCode(String string);

使用法は次のようになります。

isValidHtmlEscapeCode("A") == false
isValidHtmlEscapeCode("ש") == true // Valid unicode character
isValidHtmlEscapeCode("ש") == true // same as 1513 but in HEX
isValidHtmlEscapeCode("�") == false // Invalid unicode character

私はそれを行うものを見つけることができませんでした-それを行うユーティリティはありますか?そうでない場合、それを行うための賢い方法はありますか?

4

5 に答える 5

2
public static boolean isValidHtmlEscapeCode(String string) {
    if (string == null) {
        return false;
    }
    Pattern p = Pattern
            .compile("&(?:#x([0-9a-fA-F]+)|#([0-9]+)|([0-9A-Za-z]+));");
    Matcher m = p.matcher(string);

    if (m.find()) {
        int codePoint = -1;
        String entity = null;
        try {
            if ((entity = m.group(1)) != null) {
                if (entity.length() > 6) {
                    return false;
                }
                codePoint = Integer.parseInt(entity, 16);
            } else if ((entity = m.group(2)) != null) {
                if (entity.length() > 7) {
                    return false;
                }
                codePoint = Integer.parseInt(entity, 10);
            } else if ((entity = m.group(3)) != null) {
                return namedEntities.contains(entity);
            }
            return 0x00 <= codePoint && codePoint < 0xd800
                    || 0xdfff < codePoint && codePoint <= 0x10FFFF;
        } catch (NumberFormatException e) {
            return false;
        }
    } else {
        return false;
    }
}

これが名前付きエンティティのセットですhttp://pastebin.com/XzzMYDjF

于 2012-12-20T15:38:31.783 に答える
2

これが完璧なソリューションであるかどうかはわかりませんが、ApacheCommonsLangを使用できます。

try {
    return StringEscapeUtils.unescapeHtml4(code).length() < code.length();
} catch (IllegalArgumentException e) {
    return false;
}
于 2012-12-20T15:24:50.157 に答える
2

Apache commons StringUtilsを確認することをお勧めします: http ://commons.apache.org/lang/api-2.3/org/apache/commons/lang/StringEscapeUtils.html#unescapeHtml(java.lang.String )

unescapeHtmlを使用すると、sthを実行できます。お気に入り:

String input = "A";
String unescaped = StringEscapeUtils.unescapeHtml(input);
boolean containsValidEscape = !input.equals(a);
于 2012-12-20T15:25:59.943 に答える
1

これはあなたが望んでいた方法でなければなりません:

public static boolean isValidHtmlEscapeCode(String string) {
String temp = "";
try {
    temp = StringEscapeUtils.unescapeHtml3(string);
} catch (IllegalArgumentException e) {
    return false;
}
return !string.equals(temp);
}
于 2012-12-20T15:35:53.453 に答える
0

正規表現を使用して照合してみてください。

public boolean isValidHtmlEscapeCode(String string) {
    return string.matches("&;#([0-9]{1,4}|x[0-9a-fA-F]{1,4});");
}

または、いくつかの処理サイクルを節約するために、複数の比較のために正規表現を再利用できます。

Pattern pattern = Pattern.compile("&;#([0-9]{1,4}|x[0-9a-fA-F]{1,4});");

public boolean isValidHtmlEscapeCode(String string) {
    return pattern.matches(string);
}

正規表現のソースはRexLib.comで見つけることができます

于 2012-12-20T15:30:43.630 に答える