2012-03-02 144 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)); 
    } 
    

    }