【问题标题】:Java to Upper Case Ignoring HTML Special CharactersJava 转大写忽略 HTML 特殊字符
【发布时间】:2012-08-23 14:41:22
【问题描述】:

如何将字符串转换为大写 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;
}

【问题讨论】:

    标签: java html string encoding html-manipulation


    【解决方案1】:

    您是只对跳过 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>
    

    【讨论】:

    • 不使用 Jsoup 也可以吗?
    • 嗯,是的,但是您需要包含或编写一些其他 HTML 解析器。 JSoup 是轻量级、高质量、经过良好测试并在许可许可下发布的。自己正确地做这样的事情并非易事。不知道你还能要求什么:)。
    【解决方案2】:

    你可以用这个正则表达式将字符串分成不同的组

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

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

    完成后,您可以仅将第一组转换为大写,重复字符串的所有匹配项。

    【讨论】:

    • 这比我的解决方案更简单,但在技术上失败了有人在其 HTML 中包含 &amp;fooooo; 的极端情况。由于这不是一个定义的实体,它应该被解释为纯文本(因此被 Vad 的代码大写)。
    【解决方案3】:

    我认为您的想法是正确的,将所有命名实体替换为其数字等价物。

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

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

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 1970-01-01
      • 2013-12-11
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-30
      • 2021-10-09
      相关资源
      最近更新 更多