Java 删除html文本中的注释内容
程序员文章站
2022-07-12 13:33:40
...
最近项目中有一个功能需要读取外部html文本文件。但是有的html文件里面有大量的注释,需要删除其中的注释在存储。其实删除html文本中的注释有很多方法,这里就自己随便写了一个处理方法,权当笔记,有需要的同学可以参考。
html文本的注释有几个特点:
1. 成对出现,有开始就一定有结束。
2. 注释标签没有嵌套,注释开始标签(以下称为 <!--)下一个一定是其对应的结束标签(以下称为 -->)。
3. 一行中可能有多个注释标签对儿。
4. 注释也可以换行。
大致有以下几种情况:
思路:
1. 每次读取一行文本。
2. 如果该行中只包含<!-- 与 -->,并且<!-- 在 --> 之前。直接删除两标签之间的注释内容,获取其他内容。
3. 如果该行中只包含<!-- 与 -->,但是<!-- 在 --> 之后。获取两个标签之间的内容,并且标注已遇到<!--标签。
4. 如果该行中只包含<!--,获取标签前面的内容,并且标注已遇到<!--标签。
5. 如果该行中只包含-->,获取标签后面的内容,并且标注已遇到 --> 标签。
6. 对该行剩下的内容再执行2,3,4,5步骤。
7. 保存剩下的内容。
8. 读取下一行。
直接上代码:
当然,还有其他很多的方法,也可以通过正则匹配删除,也可以通过Stack标记开始结束。
等等,以上代码经过测试使用,希望对有需要的同学有用。
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标记开始结束。
等等,以上代码经过测试使用,希望对有需要的同学有用。
上一篇: Solr与Mysql简单集成
下一篇: Solr与Mysql简单集成