2012-03-02 87 views
-1

这里是我的字符串:删除HTML标签使用的StringTokenizer

String str = "<pre><font size="5"><strong><u>LVI . The Day of Battle</u></strong></font>   
<font 
size="4"><strong>"; 

我想删除所有的HTML标签的字符串使用StringTokenizer。但我不明白如何在这种情况下使用StringTokenizer。因为当我使用str.replaceAll("\\<.*?>","")时,删除所有标记效率不高,因为某些标记将位于字符串的下一行,如上面的字符串所示。但我想要在<>之间的所有情况下执行此操作。我该怎么做? (我想用StringTokenizer实现它)。谢谢..

+0

A)你不应该使用'StringTokenizer'。正如文档所述,这是一个遗留类。B)试图用正则表达式解析HTML是徒劳的。 – 2012-03-02 23:29:38

+0

@BrianRoach还有另外一个用于删除html标签的库JSon,但我无法使用其他库,并且似乎没有其他方法来实现它。 – El3ctr0n1c4 2012-03-02 23:32:57

+0

为什么你不能使用其他库? – DNA 2012-03-02 23:43:28

回答

1

试图用正则表达式或StringTokenizer处理HTML是痛苦的。

This answer是你进一步前的必读书。

如果你的HTML文件是简单的,你可能逃脱移除换行符,然后施加一个正则表达式,然后重新格式化HTML - 或尽量多的正则表达式。

但是你真的应该看看使用正确的HTML解析器。请参阅this question(可能还有其他许多...)

2

作为一般规则,除HTML解析库之外,不应使用任何其他解析方法解析HTML。编写您自己的解析器会产生安全风险,并将您的应用程序暴露给可能的攻击媒介,如跨站脚本和各种其他错误。再说一遍:不要用正则表达式或简单的标记器来解析HTML。此规则的一个例外情况是,如果您有一小组已知的HTML数据输入,并且您将在该数据上使用您的代码只有。在这种情况下,您可以并且应该验证您的代码是否为每个输入做了正确的事情。

这就是说,你的原始正则表达式非常接近。点通配符匹配除了换行符以外的所有内容,因此如果我们将除换行符通配符之外的换行符添加到正则表达式中,我们将在测试字符串中获得肯定的结果。

String result = str.replaceAll("<(.|\r|\n|\f)*?>",""); 

不要在未知输入中使用此代码!请勿将其用于生产!它不是一个安全或正确的方法来处理HTML。

+0

+1正确警告解析HTML与正则表达式(需要我包含[义务链接](http://stackoverflow.com/a/1732454/960195)?)。然而,跨站点脚本攻击是一类特定的错误,攻击者可以通过该错误诱骗用户的浏览器执行恶意代码(通常是JavaScript)。简单地解析HTML并不能让你知道XSS,因为你没有执行任何操作。 – 2012-03-03 03:59:54

0

最好使用HTML解析器库而不是StringTokenizer。请看看下面的演示:

  1. 下载jsoup-1.6.1.jar核心库从http://jsoup.org/download
  2. 将此库添加到您的类路径中。
  3. 随你喜欢的HTML一起玩。下面的示例是将HTML内容转换为文本格式的代码:

    import org.jsoup.Jsoup;

    公共类的HTMLParser {

    public static String removeAllHtml(String htmlContent) { 
        return Jsoup.parse(htmlContent).text(); 
    } 
    
    public static void main(String[] args) { 
        String htmlContent = "<pre><font size=\"5\"><strong><u>LVI . The Day of Battle</u></strong></font><fontsize=\"4\"><strong>"; 
        System.out.println(removeAllHtml(htmlContent)); 
    } 
    

    }