源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Java 批量删除html中注释内容的方法

  • 时间:2022-08-06 19:29 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Java 批量删除html中注释内容的方法
其实删除html文本中的注释有很多方法,这里就自己随便写了一个处理方法,权当笔记,有需要的同学可以参考。 html文本的注释有几个特点: 1. 成对出现,有开始就一定有结束。 2. 注释标签没有嵌套,注释开始标签(以下称为 <!--)下一个一定是其对应的结束标签(以下称为 -->)。 3. 一行中可能有多个注释标签对儿。 4. 注释也可以换行。 大致有以下几种情况:
[u]复制代码[/u] 代码如下:
<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. 读取下一行。
[u]复制代码[/u] 代码如下:
    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标记开始结束。 等等,以上代码经过测试使用,希望对有需要的同学有用。
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部