2012-08-23 35 views
1

如何将字符串转换为大写字符串String.toUpperCase()忽略 等所有其他特殊字符。问题在于它变为 ,浏览器无法将它们识别为特殊的HTML字符。Java to upper case忽略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

你只对跳过HTML实体感兴趣,或者你也想跳过标签吗?怎么样的大块的JavaScript? URL的链接?

如果您需要支持这种类型的东西,您将无法避免使用“真正的”HTML解析器而不是正则表达式。例如,分析使用jsoup文档,操作生成的文档,并将其转换回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> 
+0

我可以在没有Jsoup的情况下做同样的事吗? – Vad

+0

好的,但是,您需要包含或编写一些其他HTML解析器。 JSoup是轻量级,高质量,经过充分测试和发布的许可证。自己正确地做这样的事情并不重要。不知道你可以要求什么:)。 –

0

你可以用这个表达式

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

第一部分之前匹配的文本在不同群体的字符串分割特殊字符,第二部分匹配特殊字符。

一旦你完成了,你可以转换为大写只有第一组,重复所有匹配的字符串。

+0

这比简单我的解决方案,但在技术上失败了某人在其HTML中具有'&fooooo;'的情况。由于这不是一个确定的实体,因此它应该被解释为纯文本(因此Vad的代码更高)。 –

+0

你说得对。这取决于角落案件的存在。 – Gabber

0

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

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

你可以格式化成一个单一的两列的表没有太多的工作。 (请注意,该链接有三个表格。)我会这样做,然后阅读表格,并且可以轻松地将名称转换为数字并将其转换回来。