在java中使用实体编号而不是名称转义html

rsl1atfo  于 2023-05-27  发布在  Java
关注(0)|答案(2)|浏览(121)

Java可以使用例如Apache CommonsText StringEscapeUtils,但它将使用html实体名称,而不是数字。那么>变成了>有没有一个库或者类或者一些可行的自定义方法可以使用html实体编号,所以>变成了>变成了€等等?
(上下文:我使用的平台中,出于安全原因,某些进程不再接受使用实体名称的转义html,所以我真的需要实体编号)。

2sbarzqh

2sbarzqh1#

似乎没有。
Apache Commons Text库将值直接Map到名称。
Apache Commons Text -EntityArrays.java
您可以使用基本集合"&<>创建自己的实现。

String escape(String string) {
    StringBuilder escaped = new StringBuilder();
    for (char character : string.toCharArray()) {
        switch (character) {
            case '"', '&', '<', '>' -> {
                escaped.append("&#%d;".formatted((int) character));
            }
            default -> escaped.append(character);
        }
    }
    return escaped.toString();
}

输入

<html>stack overflow</html>

输出量

&#60;html&#62;stack overflow&#60;/html&#62;

如果您希望创建一个escape模式,它将封装更大范围的值,您可以实现一个range参数。
注意,这里的范围是允许的代码点,而不是要转义的代码点。

record Range(int start, int limit) { }

/** @param ranges allowed code-points */
String escape(String string, Range... ranges) {
    StringBuilder escaped = new StringBuilder();
    int codePoint;
    boolean allowed;
    for (char character : string.toCharArray()) {
        codePoint = (int) character;
        allowed = false;
        for (Range range : ranges) {
            if (codePoint >= range.start && codePoint <= range.limit) {
                allowed = true;
                break;
            }
        }
        if (allowed) escaped.append(character);
        else escaped.append("&#%d;".formatted(codePoint));
    }
    return escaped.toString();
}
piwo6bdm

piwo6bdm2#

您也可以使用org.springframework.web.util.HtmlUtils中的方法:

//Send a input string in parameter
HtmlUtils.htmlEscapeDecimal(String input)

我希望它能像你期望的那样为你工作。

相关问题