在Java中用HTML实体替换字符

7

我希望在过滤器内将HTML响应中的特定字符替换为它们相应的HTML实体。这些字符包括<>&。由于replaceAll()会替换所有字符,甚至包括HTML标记中的字符,因此我不能使用该方法。

有什么最好的方法来完成这个任务?


如果已经形成了一个包含HTML标签和独立字符(如<)混合的字符串,那么可能为时已晚。在将字符串data包含在标签内之前,您能否对其进行HTML编码? - Damien_The_Unbeliever
我的应用程序边界不允许我更早地完成它 :( - user1448652
1
但是想一想 - 如果能够可靠地使用完整的字符串来做到这一点,你就不需要进行编码了 - 网页浏览器将使用任何这种神奇技术来区分标记和一般文本。 - Damien_The_Unbeliever
这就是我需要做的事情。到目前为止,我正在逐个字符遍历HTML,并检查'<'和'>'。将其视为标签(忽略属性),我在预定义的标签列表中进行检查。如果没有找到匹配项,则对'<'和'>'进行编码。我不知道这是否是正确的方法... - user1448652
4个回答

12

这是我个人认为最好的解决方案。 - Jean-Rémy Revy
简单、干净,同时在Groovy中也能正常工作。 - The Unknown Dev
4
值得注意的是:如果您已经在使用一个Web框架,那么很有可能类似的函数已经内置于该框架中。例如,Spring框架已经有了HtmlUtils.htmlEscape()函数,文档链接在这里:http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/util/HtmlUtils.html。 - Josh1billion
org.apache.commons.lang3现已被弃用,替代方案是org.apache.commons.text - tigrou

1

如果您正在使用JSTL等技术,您可以使用<c:out value="${myObject.property}"/>来简单地打印出该值,并且它将自动转义。

属性escapeXml默认为true

escapeXml - 确定是否应将结果字符串中的字符<,>,&,',"转换为相应的字符实体代码。默认值为true

http://docs.oracle.com/javaee/5/jstl/1.1/docs/tlddocs/


在 HTML 响应到达我之前,我无法控制该应用程序。 - user1448652

0

0

由于大多数解决方案引用了已弃用的Apache类,因此我从https://dev59.com/o2445IYBdhLWcg3waplH#16947646中进行了适应。

public class StringUtilities {

    public static final String[] HTML_ENTITIES = {"&", "<", ">", "\"", "'", "/"};
    public static final String[] HTML_REPLACED =  {"&amp;", "&lt;", "&gt;", "&quot;", "&apos;", "&sol;"};

    public static String escapeHtmlEntities(String text) {
        return StringUtils.replaceEach(text, HTML_ENTITIES, HTML_REPLACED);
    }
}

注意:这不是一个全面的解决方案(它不具备上下文感知能力,可能过于激进),但我需要一个快速、有效的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接