本文目录导读:

我来为您详细解释如何使用JEditorPane和HTMLEditorKit进行HTML解析和替换操作。
基本替换操作
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.io.*;
public class HTMLReplaceExample {
public static void main(String[] args) {
JFrame frame = new JFrame("HTML Replace Example");
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
editorPane.setEditable(true);
// 设置HTML内容
String htmlContent = "<html><body>" +
"<h1>原始标题</h1>" +
"<p>这是一段文本内容</p>" +
"<p>包含需要替换的文本</p>" +
"<a href='http://example.com'>链接文本</a>" +
"</body></html>";
editorPane.setText(htmlContent);
// 创建按钮进行替换
JButton replaceButton = new JButton("替换文本");
replaceButton.addActionListener(e -> {
// 执行替换操作
replaceInHTMLEditor(editorPane, "替换", "已替换");
});
frame.add(new JScrollPane(editorPane));
frame.add(replaceButton, java.awt.BorderLayout.SOUTH);
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
高级HTML解析和替换
import javax.swing.text.*;
import javax.swing.text.html.*;
import javax.swing.text.html.parser.*;
import java.util.*;
public class AdvancedHTMLReplace {
/**
* 替换HTML中的指定文本
*/
public static void replaceInHTMLEditor(JEditorPane editor,
String oldText,
String newText) {
try {
Document doc = editor.getDocument();
String content = doc.getText(0, doc.getLength());
// 替换文本
content = content.replaceAll(
Pattern.quote(oldText),
Matcher.quoteReplacement(newText)
);
// 更新文档
editor.setText(content);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
/**
* 使用正则表达式替换HTML内容
*/
public static void replaceWithRegex(JEditorPane editor,
String regex,
String replacement) {
try {
Document doc = editor.getDocument();
String content = doc.getText(0, doc.getLength());
// 使用正则替换
content = content.replaceAll(regex, replacement);
// 更新文档
editor.setText(content);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
/**
* 替换特定HTML标签内的文本
*/
public static void replaceInTag(JEditorPane editor,
String tag,
String oldText,
String newText) {
try {
Document doc = editor.getDocument();
String content = doc.getText(0, doc.getLength());
// 使用正则匹配特定标签内的内容
String regex = "(<" + tag + "[^>]*>)(.*?)(" + Pattern.quote(oldText) + ")(.*?</" + tag + ">)";
String replacement = "$1$2" + Matcher.quoteReplacement(newText) + "$4";
content = content.replaceAll(regex, replacement);
// 更新文档
editor.setText(content);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
/**
* 批量替换多个文本
*/
public static void batchReplace(JEditorPane editor,
Map<String, String> replacements) {
try {
Document doc = editor.getDocument();
String content = doc.getText(0, doc.getLength());
for (Map.Entry<String, String> entry : replacements.entrySet()) {
content = content.replaceAll(
Pattern.quote(entry.getKey()),
Matcher.quoteReplacement(entry.getValue())
);
}
// 更新文档
editor.setText(content);
} catch (BadLocationException e) {
e.printStackTrace();
}
}
}
使用HTMLEditorKit进行解析
import javax.swing.text.html.*;
import javax.swing.text.*;
import java.awt.event.*;
public class HTMLEditorKitParserExample {
public static void main(String[] args) {
JFrame frame = new JFrame("HTMLEditorKit Parser Example");
JEditorPane editorPane = new JEditorPane();
// 设置HTML编辑器套件
HTMLEditorKit kit = new HTMLEditorKit();
editorPane.setEditorKit(kit);
editorPane.setEditable(true);
// 设置初始HTML内容
String html = "<html><body>" +
"<h1>标题</h1>" +
"<p>段落文本 <b>加粗文本</b> 普通文本</p>" +
"<ul><li>列表项1</li><li>列表项2</li></ul>" +
"</body></html>";
editorPane.setText(html);
JButton parseButton = new JButton("解析和替换");
parseButton.addActionListener(e -> {
// 使用HTMLEditorKit解析
HTMLDocument doc = (HTMLDocument) editorPane.getDocument();
HTMLDocument.Iterator iterator = doc.getIterator(
HTML.Tag.CONTENT
);
while (iterator.isValid()) {
try {
int start = iterator.getStartOffset();
int end = iterator.getEndOffset();
String text = doc.getText(start, end - start);
// 执行替换逻辑
if (text.contains("原始文本")) {
// 替换文本
doc.replace(start, end - start, "新文本", null);
}
} catch (BadLocationException ex) {
ex.printStackTrace();
}
iterator.next();
}
});
JPanel panel = new JPanel();
panel.add(parseButton);
frame.add(new JScrollPane(editorPane));
frame.add(panel, java.awt.BorderLayout.SOUTH);
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
完整的替换工具类
import javax.swing.*;
import javax.swing.text.*;
import javax.swing.text.html.*;
import java.util.regex.*;
public class HTMLEditorReplaceUtil {
/**
* 简单文本替换(替换纯文本内容,不涉及HTML标签)
*/
public static void simpleTextReplace(JEditorPane editor,
String oldText,
String newText) {
try {
HTMLDocument doc = (HTMLDocument) editor.getDocument();
String content = getTextContent(doc);
// 替换文本
content = content.replace(oldText, newText);
// 重新设置内容
editor.setText(content);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 智能替换(保留HTML结构)
*/
public static void smartReplace(JEditorPane editor,
String oldText,
String newText) {
try {
HTMLDocument doc = (HTMLDocument) editor.getDocument();
String html = getHTMLContent(doc);
// 仅替换不在标签内的文本
html = replaceTextInContent(html, oldText, newText);
// 更新编辑器内容
editor.setText(html);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 替换指定标签内的文本
*/
public static void replaceInSpecifiedTag(JEditorPane editor,
String tagName,
String oldText,
String newText) {
try {
HTMLDocument doc = (HTMLDocument) editor.getDocument();
String html = getHTMLContent(doc);
// 匹配指定标签内的内容
String pattern = "<" + tagName + "[^>]*>([^<]*" +
Pattern.quote(oldText) + "[^<]*)</" + tagName + ">";
html = html.replaceAll(pattern,
"<" + tagName + ">$1</" + tagName + ">".replace(oldText, newText));
editor.setText(html);
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 获取文本内容(不含HTML标签)
*/
private static String getTextContent(HTMLDocument doc) throws BadLocationException {
StringBuilder sb = new StringBuilder();
ElementIterator iterator = new ElementIterator(doc);
Element element;
while ((element = iterator.next()) != null) {
if (element.getName().equals("content")) {
int start = element.getStartOffset();
int end = element.getEndOffset();
sb.append(doc.getText(start, end - start));
}
}
return sb.toString();
}
/**
* 获取完整的HTML内容
*/
private static String getHTMLContent(HTMLDocument doc) throws BadLocationException {
return doc.getText(0, doc.getLength());
}
/**
* 替换文本内容(保留HTML标签)
*/
private static String replaceTextInContent(String html,
String oldText,
String newText) {
StringBuilder result = new StringBuilder();
boolean inTag = false;
StringBuilder currentText = new StringBuilder();
for (int i = 0; i < html.length(); i++) {
char c = html.charAt(i);
if (c == '<') {
// 处理之前累积的文本
if (currentText.length() > 0) {
String processed = currentText.toString()
.replace(oldText, newText);
result.append(processed);
currentText = new StringBuilder();
}
inTag = true;
result.append(c);
} else if (c == '>') {
inTag = false;
result.append(c);
} else if (!inTag) {
currentText.append(c);
} else {
result.append(c);
}
}
// 处理最后剩余的文本
if (currentText.length() > 0) {
result.append(currentText.toString().replace(oldText, newText));
}
return result.toString();
}
/**
* 使用示例
*/
public static void main(String[] args) {
JFrame frame = new JFrame("HTML Replace Utility");
JEditorPane editorPane = new JEditorPane();
editorPane.setContentType("text/html");
// 设置示例HTML
String html = "<html><body>" +
"<h1>Hello World</h1>" +
"<p>This is a <b>Hello</b> example</p>" +
"<p>Another Hello text</p>" +
"</body></html>";
editorPane.setText(html);
// 创建各种替换按钮
JPanel buttonPanel = new JPanel();
JButton simpleReplace = new JButton("简单替换");
simpleReplace.addActionListener(e ->
simpleTextReplace(editorPane, "Hello", "Hi")
);
JButton smartReplace = new JButton("智能替换");
smartReplace.addActionListener(e ->
smartReplace(editorPane, "Hello", "Hi")
);
JButton replaceInTag = new JButton("替换在p标签内");
replaceInTag.addActionListener(e ->
replaceInSpecifiedTag(editorPane, "p", "Hello", "Hi")
);
buttonPanel.add(simpleReplace);
buttonPanel.add(smartReplace);
buttonPanel.add(replaceInTag);
frame.add(new JScrollPane(editorPane));
frame.add(buttonPanel, java.awt.BorderLayout.SOUTH);
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
- 直接替换:使用
editorPane.setText()重新设置整个HTML内容 - 保留结构:使用正则表达式匹配非标签内的文本进行替换
- 解析替换:使用
HTMLDocument和ElementIterator遍历元素进行替换 - 性能考虑:对于大型文档,建议使用
HTMLDocument的迭代器方法
这些方法可以满足大多数HTML内容替换的需求,根据具体场景选择合适的替换策略。
版权声明:足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
足球直播
足球直播
足球直播
足球直播
足球直播
中超直播
中超直播
中超直播
中超直播
中超直播
英超直播
英超直播
英超直播
英超直播
英超直播
德甲直播
德甲直播
德甲直播
德甲直播
德甲直播
西甲直播
西甲直播
西甲直播
西甲直播
西甲直播
意甲直播
意甲直播
意甲直播
意甲直播
意甲直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播