首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java HTML 標籤清洗:正則表達式移除標籤與實體字元完整方案

     編輯:Java 相關知識

需求場景

富文本編輯器輸出、爬蟲擷取內容、前端 XSS 防護等場景,需移除 HTML 標籤並解碼實體字元(如  、<)。

核心正則


// 1. 移除實體字元 &xxx;
str = str.replaceAll("&[a-zA-Z]{1,10};", "");
// 2. 移除所有標籤 <...>
str = str.replaceAll("<[^>]*>", "");
// 3. 合併寫法
str = str.replaceAll("&[a-zA-Z]{1,10};", "").replaceAll("<[^>]*>", "");

完整工具類


public class HtmlCleaner {
    private static final Pattern ENTITY_PATTERN = Pattern.compile("&[a-zA-Z]{1,10};|&#\\d{1,5};|&#x[0-9a-fA-F]{1,4};");
    private static final Pattern TAG_PATTERN = Pattern.compile("<[^>]*>", Pattern.DOTALL);

    /** 移除標籤與實體,保留純文字,標籤間換行 */
    public static String clean(String html) {
        if (html == null) return "";
        String text = ENTITY_PATTERN.matcher(html).replaceAll("");
        text = TAG_PATTERN.matcher(text).replaceAll("\n");
        // 壓縮多餘空白行
        return text.replaceAll("\\n{3,}", "\n\n").trim();
    }

    /** 移除指定標籤 (如 script, style) 及其內容 */
    public static String removeTags(String html, String... tagNames) {
        if (html == null || tagNames.length == 0) return html;
        StringBuilder regex = new StringBuilder("(?is)<(");
        for (int i = 0; i < tagNames.length; i++) {
            if (i > 0) regex.append('|');
            regex.append(Pattern.quote(tagNames[i]));
        }
        regex.append(")\\b[^>]*>.*?");
        // 簡化:實際需為每個標籤構建獨立正則
        return html.replaceAll(regex.toString(), "");
    }
}

測試範例


public static void main(String[] args) {
    String html = "
\n" + "

標題 & 子標題

\n" + "

內容 包含 實體

\n" + " \n" + "
"; System.out.println(HtmlCleaner.clean(html)); }

輸出結果


標題  子標題
內容 包含 實體

alert('xss')

進階建議:使用成熟庫

庫特點
JsoupJsoup.clean(html, Whitelist.none()) 白名單機制,防 XSS 業界標準
HtmlCleanerDOM 解析,容錯性強,可輸出 XML
OWASP Java HTML Sanitizer專注 XSS 防護,效能高,Google 維護

正則局限性提醒

  • 無法正確處理巢狀標籤、屬性值含 >、CDATA、註解等複雜結構。
  • 大量 HTML 解析效能差,易發生災難性回溯。
  • 生產環境強烈建議使用 Jsoup 等專業解析器。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved