JEditorPaneHTMLEditorKitParserStrip去除操作

wen java案例 2

本文目录导读:

JEditorPaneHTMLEditorKitParserStrip去除操作

  1. 去除所有 HTML 标签,只提取纯文本
  2. 去除特定标签(如 <script>, <style>
  3. 去除特定属性(如 onclick、style)
  4. 去除自身闭合的无效标签(如 <xml>, <?...?>)
  5. 总结建议

JEditorPaneHTMLEditorKit 和 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>, <?...?>)

你可以利用 HTMLParserhandleSimpleTaghandleEndOfLineString,配合正则表达式辅助,但在 Swing 里更推荐用上面的 Parser 回调来做。


总结建议

需求 推荐方法
只保留纯文本 JEditorPane.getText()
删除特定标签(script, style) HTMLEditorKit.ParserCallback + 状态机
删除特定属性(onclick, style) ParserCallback.handleStartTag + 过滤属性
保留所有标签但清理格式 javax.swing.text.html.HTMLWriter 重新写入

如果你的实际需求是“从 JEditorPane 中显示文本后去除格式”,最简单的就是用 getText() 方法。

抱歉,评论功能暂时关闭!