在處理網頁爬蟲、內容過濾或 XSS 防護時,常需從字串中移除 HTML 標籤。本文介紹一個功能完整的 HTMLServices 工具類,提供多種重載方法支援:純標籤移除、空白字元清理、長度截斷、CSS 樣式解析等進階功能。
使用正則表達式 (?is)<(.*?)> 進行不區分大小寫、單行模式的全域替換:
/**
* 移除字串中的所有 HTML 標籤
* @param args 待處理字串
* @return 移除標籤後的純文字內容
*/
public static String clearHTMLToString(String args) {
return clearHTMLToString(args, false);
}
/**
* 移除 HTML 標籤,可選是否清理空白字元
* @param args 待處理字串
* @param replaceNull true=移除空白/換行/製表符
* @return 處理後字串
*/
public static String clearHTMLToString(String args, boolean replaceNull) {
if (StringUtils.isEmpty(args)) {
return "";
}
// (?i) 不區分大小寫,(?s) 讓 . 匹配換行符
args = args.replaceAll("(?is)<(.*?)>", "");
if (replaceNull) {
args = args.replaceAll("\\s*|\\t|\\r|\\n", "");
}
return args;
}
支援移除標籤後指定最大長度,超出時自動截斷並加上替代字串(如「...」):
/**
* 移除 HTML 標籤並限制最大長度
* @param args 待處理字串
* @param maxSize 最大長度
* @return 處理後字串
*/
public static String clearHTMLToString(String args, int maxSize) {
return clearHTMLToString(args, maxSize, "");
}
/**
* 移除 HTML 標籤並限制最大長度,支援自訂替代字串
* @param args 待處理字串
* @param maxSize 最大長度
* @param replace 超出長度時的替代字串(如 "...")
* @return 處理後字串
*/
public static String clearHTMLToString(String args, int maxSize, String replace) {
args = clearHTMLToString(args);
if (maxSize <= 0 || args.length() <= maxSize) {
return args;
}
return args.substring(0, maxSize).concat(replace);
}
類別還內建 CSS 樣式字串與 Map 互轉功能,方便處理內聯樣式:
/**
* 將 CSS 樣式字串轉為 Map<屬性, 值>
* 例: "font-size:12px;color:red;" → {font-size=12px, color=red}
*/
public static Map<String, String> cssToMap(String style) {
Map<String, String> map = new HashMap<>();
if (style == null || StringUtils.isEmpty(style)) {
return map;
}
style = style.toLowerCase().split("\\}")[0]; // 取第一個規則塊
String[] pairs = style.split(";");
for (String pair : pairs) {
String[] kv = pair.split(":");
if (kv.length == 2) {
map.put(kv[0].replace(" ", "").trim(), kv[1].trim());
}
}
return map;
}
/**
* 從樣式字串取得指定屬性值
*/
protected static String getStyleToString(String style, String styleName) {
try {
Map<String, String> css = cssToMap(style);
return css.get(styleName);
} catch (Exception e) {
log.error(e);
}
return "";
}
/**
* 將 Map 轉回 CSS 字串
*/
public static String mapToCSS(Map<String, String> css) {
StringBuilder style = new StringBuilder();
for (Map.Entry<String, String> entry : css.entrySet()) {
if (style.length() > 0) style.append(",");
style.append(entry.getKey()).append(":").append(entry.getValue());
}
return style.toString();
}
/** 批次移除指定字元 */
public static String filterChare(String msg, String... chars) {
for (String ch : chars) {
msg = msg.replace(ch, "");
}
return msg;
}
/** 純字串截取(不處理 HTML),支援替代字串 */
public static String clearHTMLToSize(String args, int maxSize, String replace) {
if (args.length() <= maxSize) return args;
return args.substring(0, maxSize).concat(replace);
}
String html = "<div class='box'><p>Hello <b>World</b>!</p></div>";
// 基本移除標籤
String plain = HTMLServices.clearHTMLToString(html);
// 結果: "Hello World!"
// 移除標籤 + 清理空白
String compact = HTMLServices.clearHTMLToString(html, true);
// 結果: "HelloWorld!"
// 移除標籤 + 限制 10 字 + 尾碼
String summary = HTMLServices.clearHTMLToString(html, 10, "...");
// 結果: "Hello Wor..."
// 解析內聯樣式
String style = "font-size:14px;color:#333;";
String fontSize = HTMLServices.getStyleToString(style, "font-size"); // "14px"
TextNode 或 Cleaner,更穩健且防 XSS。<)。Jsoup.parse(html).text()。cssToMap 僅支援簡單單行樣式,不支援媒體查詢、偽類、多選擇器等完整 CSS 語法。HTMLServices 提供輕量、零依賴(僅需 Commons Lang3/Logging)的 HTML 文字提取與樣式處理能力,適合簡單的內容清洗、摘要產生、樣式屬性讀取等場景。對於複雜或非受信任 HTML,建議搭配 Jsoup 使用以確保安全與正確性。