最近项目中有一个功能需要读取外部html文本文件。但是有的html文件里面有大量的注释,需要删除其中的注释在存储。其实删除html文本中的注释有很多方法,这里就自己随便写了一个处理方法,权当笔记,有需要的同学可以参考。
html文本的注释有几个特点:
1. 成对出现,有开始就一定有结束。
2. 注释标签没有嵌套,注释开始标签(以下称为 <!--)下一个一定是其对应的结束标签(以下称为 -->)。
3. 一行中可能有多个注释标签对儿。
4. 注释也可以换行。
大致有以下几种情况:
<html>
<!--This is a head-->
<head>A Head</head>
<!--This is
a div -->
<div>A Div</div>
<!--This is
a span--><!--span in
a div--><div>a div</div>
<div><span>A span</span><div>
<!--This is a
span--><div>A div</div><!--span in a div-->
<div><span>A span</span><div>
<html>
思路:
1. 每次读取一行文本。
2. 如果该行中只包含<!-- 与 -->,并且<!-- 在 --> 之前。直接删除两标签之间的注释内容,获取其他内容。
3. 如果该行中只包含<!-- 与 -->,但是<!-- 在 --> 之后。获取两个标签之间的内容,并且标注已遇到<!--标签。
4. 如果该行中只包含<!--,获取标签前面的内容,并且标注已遇到<!--标签。
5. 如果该行中只包含-->,获取标签后面的内容,并且标注已遇到 --> 标签。
6. 对该行剩下的内容再执行2,3,4,5步骤。
7. 保存剩下的内容。
8. 读取下一行。
直接上代码:
public class HtmlCommentHandler {
/**
* html内容中注释的Detector
*
* @author boyce
* @version 2013-12-3
*/
private static class HtmlCommentDetector {
private static final String COMMENT_START = "<!--";
private static final String COMMENT_END = "-->";
// 该字符串是否是html注释行,包含注释的开始标签且结束标签"<!-- -->"
private static boolean isCommentLine(String line) {
return containsCommentStartTag(line) && containsCommentEndTag(line)
&& line.indexOf(COMMENT_START) < line.indexOf(COMMENT_END);
}
// 是否包含注释的开始标签
private static boolean containsCommentStartTag(String line) {
return StringUtils.isNotEmpty(line) &&
line.indexOf(COMMENT_START) != -1;
}
// 是否包含注释的结束标签
private static boolean containsCommentEndTag(String line) {
return StringUtils.isNotEmpty(line) &&
line.indexOf(COMMENT_END) != -1;
}
/**
* 删除该行中的注释部分
*/
private static String deleteCommentInLine(String line) {
while (isCommentLine(line)) {
int start = line.indexOf(COMMENT_START) + COMMENT_START.length();
int end = line.indexOf(COMMENT_END);
line = line.substring(start, end);
}
return line;
}
// 获取开始注释符号之前的内容
private static String getBeforeCommentContent(String line) {
if (!containsCommentStartTag(line))
return line;
return line.substring(0, line.indexOf(COMMENT_START));
}
// 获取结束注释行之后的内容
private static String getAfterCommentContent(String line) {
if (!containsCommentEndTag(line))
return line;
return line.substring(line.indexOf(COMMENT_END) + COMMENT_END.length());
}
}
/**
* 读取html内容,去掉注释
*/
public static String readHtmlContentWithoutComment(BufferedReader reader) throws IOException {
StringBuilder builder = new StringBuilder();
String line = null;
// 当前行是否在注释中
boolean inComment = false;
while (ObjectUtils.isNotNull(line = reader.readLine())) {
// 如果包含注释标签
while (HtmlCommentDetector.containsCommentStartTag(line) ||
HtmlCommentDetector.containsCommentEndTag(line)) {
// 将成对出现的注释标签之间的内容删除
// <!-- comment -->
if (HtmlCommentDetector.isCommentLine(line)) {
line = HtmlCommentDetector.deleteCommentInLine(line);
}
// 如果不是注释行,但是依然存在开始标签和结束标签,结束标签一定在开始标签之前
// xxx -->content<!--
else if (HtmlCommentDetector.containsCommentStartTag(line) && HtmlCommentDetector.containsCommentEndTag(line)) {
// 获取结束标签之后,开始标签之前的文本,并且将 inComment设置为true
line = HtmlCommentDetector.getAfterCommentContent(line);
line = HtmlCommentDetector.getBeforeCommentContent(line);
inComment = true;
}
// 如果只存在开始标签,因为注释标签不支持嵌套,只有开始标签的行一定不会inComment
// content <!--
else if (!inComment && HtmlCommentDetector.containsCommentStartTag(line)) {
// 将 inComment 设置为true。获取开始标签之前的内容
inComment = true;
line = HtmlCommentDetector.getBeforeCommentContent(line);
}
// 如果只存在结束标签,因为注释标签不支持嵌套,只有结束标签的行一定inComment
// -->content
else if (inComment && HtmlCommentDetector.containsCommentEndTag(line)) {
// 将 inComment 设置为false。获取结束标签之后的内容
inComment = false;
line = HtmlCommentDetector.getAfterCommentContent(line);
}
// 保存该行非注释的内容
if (StringUtils.isNotEmpty(line))
builder.append(line);
}
// 保存该行不存在任何注释标签的并且inComment = false的行
if (StringUtils.isNotEmpty(line) && !inComment)
builder.append(line);
}
return builder.toString();
}
}
当然,还有其他很多的方法,也可以通过正则匹配删除,也可以通过Stack标记开始结束。
等等,以上代码经过测试使用,希望对有需要的同学有用。
分享到:
相关推荐
在Java编程中,处理HTML文件时有时需要去除其中的注释内容,以实现特定的功能需求,比如在给定的项目中,需要读取HTML文本文件并删除其中的注释以便进一步处理或存储。删除HTML注释的过程涉及到对HTML结构的理解以及...
javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...
这个过程被称为“删除代码中的注释”。下面将详细介绍如何进行这一操作,以及涉及的相关技术。 1. **选择目录**: 在删除代码中的注释时,首先需要确定要处理的代码范围。这通常是一个包含源代码文件的目录。例如...
HTMLParser是一个基于Java的库,专门用于...总的来说,`HTMLParser.zip`提供的工具和API使得Java开发者能够有效地处理HTML文档,无论这些文档是否规范,从而在各种应用场景中实现数据提取、内容处理和网页解析的需求。
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
在Java编程中,有时我们需要处理含有HTML标签的文本,例如从网页抓取的数据或用户输入包含HTML格式的内容。为了进一步处理这些数据,我们可能需要清除HTML标签,仅保留纯文本内容。以下是一个简单的Java方法,用于...
在这个压缩包中,我们主要关注的是与Java、HTML和jQuery相关的API文档。 首先,Java API文档是Java开发的核心资源,它包含了Java平台标准版(Java SE)的所有类和接口的详细信息。这些文档通常以Javadoc的形式呈现...
javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...
- `javadoc`是Java自带的一个工具,它可以读取源代码中的文档注释,并生成对应的HTML格式文档。 - 例如,要为位于`D:\java程序练习\01别人作业`目录下的`testDemo`类生成文档,可以在该目录下执行以下命令: ``` ...
在Java编程环境中,这样的文本编辑器可以作为开发工具的一部分,用于编写和预览源代码注释、日志输出或是动态生成的文本内容。 在Java中实现这样的文本编辑器,开发者可能会使用Swing或JavaFX等图形用户界面(GUI)...
在HTML文件中,代码行数通常包括标签、属性和文本内容。统计HTML代码行数有助于理解页面的复杂性,尤其是当涉及到大量自定义元素和脚本时。 Java是一种广泛使用的面向对象的编程语言,适用于各种应用领域,从桌面到...
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...
Java实现HTTP连接与浏览,Java源码下载,输入html文件地址或网址,显示页面和HTML源文件,一步步的实现过程请下载本实例的Java源码,代码中包括丰富的注释,对学习有帮助。 Java实现的FTP连接与数据浏览程序 1个...
在过滤注释的过程中,开发者通常会利用各种工具,例如在Java世界中,可以使用Maven或Gradle等构建工具的插件来实现。例如,Maven的`maven-javadoc-plugin`可以生成API文档,而`maven-source-plugin`可以编译源码但不...
javax.transaction.xa 提供定义事务管理器和资源管理器之间的协定的 API,它允许事务管理器添加或删除 JTA 事务中的资源对象(由资源管理器驱动程序提供)。 javax.xml 根据 XML 规范定义核心 XML 常量和功能。 ...