本文目录导读:

- 去除所有 HTML 标签,只提取纯文本
- 去除特定标签(如
<script>,<style>) - 去除特定属性(如 onclick、style)
- 去除自身闭合的无效标签(如
<xml>,<?...?>) - 总结建议
JEditorPane、HTMLEditorKit 和 HTML 解析器去除(strip)操作,你可能是在寻找如何从 HTML 内容中去除特定标签、样式或只提取纯文本的实现方法。
以下是几种常见的“去除”操作及对应的代码实现方案:
去除所有 HTML 标签,只提取纯文本
最常用的“strip”操作,使用 HTMLEditorKit 解析 HTML 后,通过 getText() 方法获取文本(此方法会过滤掉标签)。
import javax.swing.*;
import javax.swing.text.html.*;
import javax.swing.text.*;
public class HtmlStripExample {
public static String stripHtml(String html) {
if (html == null || html.isEmpty()) {
return "";
}
// 创建一个临时的编辑面板
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
editorPane.setText(html);
try {
// 获取纯文本内容(不包含标签)
return editorPane.getText();
} catch (BadLocationException e) {
e.printStackTrace();
return html; // fallback
}
}
public static void main(String[] args) {
String html = "<p>Hello <b>World</b>!</p><br><a href='#'>Link</a>";
String plainText = stripHtml(html);
System.out.println(plainText); // 输出: Hello World! Link
}
}
说明:JEditorPane.getText() 会自动去除所有标签,保留文本内容(包括空格和换行)。
去除特定标签(如 <script>, <style>)
如果你想保留部分标签,但去除特定标签(例如过滤掉 JavaScript 或样式的干扰),你需要用到 HTMLParser。
使用 HTMLEditorKit.ParserCallback 来手动解析:
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
import javax.swing.text.*;
import java.io.*;
public class CustomHtmlStripper {
public static String removeSpecificTags(String html, String... tagsToRemove) {
final StringBuilder result = new StringBuilder();
// 用于记录是否在待移除标签内部
final boolean[] skipContent = {false};
final String currentTag = "";
HTMLEditorKit.Parser parser = new HTMLEditorKit().getParser();
Reader reader = new StringReader(html);
try {
parser.parse(reader, new HTMLEditorKit.ParserCallback() {
@Override
public void handleText(char[] data, int pos) {
if (!skipContent[0]) {
result.append(data);
}
}
@Override
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
for (String tagName : tagsToRemove) {
if (t.toString().equalsIgnoreCase(tagName)) {
skipContent[0] = true;
break;
}
}
if (!skipContent[0]) {
result.append("<").append(t);
// 保留开始标签
}
}
@Override
public void handleEndTag(HTML.Tag t, int pos) {
if (skipContent[0]) {
for (String tagName : tagsToRemove) {
if (t.toString().equalsIgnoreCase(tagName)) {
skipContent[0] = false;
break;
}
}
} else {
result.append("</").append(t).append(">");
}
}
@Override
public void handleSimpleTag(HTML.Tag t, MutableAttributeSet a, int pos) {
for (String tagName : tagsToRemove) {
if (t.toString().equalsIgnoreCase(tagName)) {
// 自闭合标签,不输出
return;
}
}
result.append("<").append(t);
result.append("/>");
}
}, false); // false=不忽略字符集
} catch (IOException e) {
e.printStackTrace();
}
return result.toString();
}
public static void main(String[] args) {
String html = "<html><head><style>.cls{color:red}</style></head>" +
"<body><p>Hello</p><script>alert('hi')</script></body></html>";
String cleaned = removeSpecificTags(html, "script", "style");
System.out.println(cleaned);
// 输出:<html><head></head><body><p>Hello</p></body></html>
}
}
去除特定属性(如 onclick、style)
如果你只想去除标签里的某些属性(onclick, style 等),可以用 HTMLParser 拦截并修改属性列表。
@Override
public void handleStartTag(HTML.Tag t, MutableAttributeSet a, int pos) {
// 创建新的属性集,只保留你想要的属性
SimpleAttributeSet newAttrs = new SimpleAttributeSet();
Enumeration<?> names = a.getAttributeNames();
while (names.hasMoreElements()) {
Object key = names.nextElement();
String keyStr = key.toString().toLowerCase();
// 过滤掉 onclick, style, onload 等
if (!keyStr.startsWith("on") && !keyStr.equals("style")) {
newAttrs.addAttribute(key, a.getAttribute(key));
}
}
// 输出过滤后的标签
result.append("<").append(t);
// 将 newAttrs 转为字符串输出...
}
去除自身闭合的无效标签(如 <xml>, <?...?>)
你可以利用 HTMLParser 的 handleSimpleTag 和 handleEndOfLineString,配合正则表达式辅助,但在 Swing 里更推荐用上面的 Parser 回调来做。
总结建议
| 需求 | 推荐方法 |
|---|---|
| 只保留纯文本 | JEditorPane.getText() |
| 删除特定标签(script, style) | HTMLEditorKit.ParserCallback + 状态机 |
| 删除特定属性(onclick, style) | ParserCallback.handleStartTag + 过滤属性 |
| 保留所有标签但清理格式 | javax.swing.text.html.HTMLWriter 重新写入 |
如果你的实际需求是“从 JEditorPane 中显示文本后去除格式”,最简单的就是用 getText() 方法。