Java大写忽略HTML特殊字符

时间:2012-08-23 14:41:23

标签: java html string encoding html-manipulation

如何将字符串转换为大写String.toUpperCase(),忽略 等特殊字符以及所有其他字符。问题在于它变成了 并且浏览器不会将它们识别为特殊的HTML字符。

我想出了这个,但它没有涵盖所有特殊字符:

public static String toUpperCaseIgnoreHtmlSymbols(String str){
    if(str == null) return "";
        str = str.trim();
    str = str.replaceAll("(?i) "," ");
    str = str.replaceAll(""",""");
    str = str.replaceAll("&","&");
    //etc.
    str = str.toUpperCase();
    return str;
}

3 个答案:

答案 0 :(得分:3)

您是否只对跳过HTML实体感兴趣,还是想跳过标签?那些javascript块怎么样?链接中的URL?

如果你需要支持那种东西,你将无法避免使用“真正的”HTML解析器而不是正则表达式。例如,使用jsoup解析文档,操作生成的Document,并将其转换回HTML:

private String upperCase(String str) {
    Document document = Jsoup.parse(str);
    upperCase(document.body());
    return document.html();
}

private void upperCase(Node node) {
    if (node instanceof TextNode) {
        TextNode textnode = (TextNode) node;
        textnode.text(textnode.text().toUpperCase());
    }
    for (Node child : node.childNodes()) {
        upperCase(child);
    }
}

现在:

upperCase("This is some <a href=\"http://arnout.engelen.eu\">text&nbsp;with&nbsp;entities</a>");

将产生:

<html>
  <head></head>
  <body>
    THIS IS SOME 
    <a href="http://arnout.engelen.eu">TEXT&nbsp;WITH&nbsp;ENTITIES</a>
  </body>
</html>

答案 1 :(得分:0)

您可以使用此正则表达式将字符串拆分为不同的组

(.+?)(&[^ ]+?;)

第一部分匹配特殊字符前的文本,第二部分匹配特殊字符。

完成后,您只能将第一组转换为大写,重复该字符串的所有匹配。

答案 2 :(得分:0)

我认为你有正确的想法,用他们的数字等价替换所有命名的实体。

以下是W3C的HTML4实体列表:http://www.w3.org/TR/html4/sgml/entities.html

您可以将其格式化为单个双列表而无需太多工作。 (请注意,该链接有三个表。)我会这样做,然后读取表格,您可以轻松地从命名转换为数字并返回。