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

其实删除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标记开始结束。
等等,以上代码经过测试使用,希望对有需要的同学有用。

时间: 2024-11-01 18:55:51

Java 批量删除html中注释内容的方法_java的相关文章

从Java的jar文件中读取数据的方法_java

本文实例讲述了从Java的jar文件中读取数据的方法.分享给大家供大家参考.具体如下: Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案.它们允许开发人员把所有相关的内容 (.class.图片.声音和支持文件等) 打包到一个单一的文件中.JAR 文件格式支持压缩.身份验证和版本,以及许多其它特性. 从 JAR 文件中得到它所包含的文件内容是件棘手的事情,但也不是不可以做到.这篇技巧就将告诉你如何从 JAR 文件中取得一个文件.我们会先取得这个 JAR

详解在Java的Struts2框架中配置Action的方法_java

在Struts2中Action部分,也就是Controller层采用了低侵入的方式.为什么这么说?这是因为在Struts2中action类并不需要继承任何的基类,或实现任何的接口,更没有与Servlet的API直接耦合.它通常更像一个普通的POJO(通常应该包含一个无参数的execute方法),而且可以在内容定义一系列的方法(无参方法),并可以通过配置的方式,把每一个方法都当作一个独立的action来使用,从而实现代码复用. 例如: package example; public class U

一下子全部删除WORD括号中的内容的方法

一.前提条件 执行菜单操作:"编辑"→"替换",弹出对话框. 然后,在对话框中,先点击"高级"按钮,弹出列表,在列表中,选中"使用通配符"选项. 接着,就按如下的方法来实现替换吧. 二.批量删除的方法 ①批量删除大括号中的内容 在查找内容框中,输入 {*} 然后,直接点击"全部替换"即可. ②批量删除小括号中的内容 在查找内容框中,输入 (*) 然后,直接点击"全部替换"即可. ③批量删

批量删除Word中图片的方法

  很多时候,我们需要将word中的图片删除掉,只留下文字,不过图片数量过多,一一删除太费时.今天的word教程就是教大家如快速批量删除图片的,如果也想知道操作的方法,那就进来学习咯,以下是详细的操作步骤--批量删除Word中图片的方法: 1.启动Word2007,打开插入有图片的文档,按下Ctrl+H键,打开查找与替换对话框. 2.在替换标签中,先点击更多按钮,下方会出现搜索选项和替换,我们点击特殊格式. 3.右侧出现菜单,选择图形. 4.此时查找内容中会自动填充^g,替换为中不写入任何东西,

批量删除Excel2007中的文本和控件对象

  当工作表中有很多控件或者图片等对象时,一个一个去删除会非常的繁琐.案例阐述了如何一次性删除整个工作表中图形.控件和影音等对象,方便快捷.下面给大家介绍一下批量删除Excel2007中的文本和控件对象的方法. 1.我们启动Excel2007,打开一份插入有控件的测试题文件,要批量删除这些控件,单击菜单栏--开始--查找和选择. 2.点击查找和选择按钮之后,弹出下拉菜单,点击定位条件选项. 3.弹出定位条件对话框,勾选对象,单击确定. 4.此时会一次性选中表格中的控件对象,按下键盘上的delet

如何定位并删除内存中的内容?

问题描述 如何定位并删除内存中的内容? 例如剪切板中的内容是存储在内存中的,那么我该怎样才知道它到底存储在哪一部分并且删除它呢? 解决方案 内存中的数据,你如果能够知道地址,那么可以访问地址来修改数据等.但是还要看地址是否允许写 解决方案二: 删除它很简单,清空剪贴板或者设置点别的就可以了.

SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)_MsSql

当我们需要批量删除数据库中的表时,对于单个删除一些表是否感到烦躁,厌倦,干脆写个脚本用得了. 本脚本使用游标循环删除,对于数量比较小,用游标暂不会造成恶劣影响. 复制代码 代码如下: DECLARE @tablename VARCHAR(30),@sql VARCHAR(500)DECLARE cur_delete_table CURSOR READ_ONLY FORWARD_ONLY FORSELECT name FROM sysobjects WHERE name LIKE 'PUB%' A

SQLServer用t-sql命令批量删除数据库中指定表(游标循环删除)

当我们需要批量删除数据库中的表时,对于单个删除一些表是否感到烦躁,厌倦,干脆写个脚本用得了. 本脚本使用游标循环删除,对于数量比较小,用游标暂不会造成恶劣影响. 复制代码 代码如下:DECLARE @tablename VARCHAR(30),@sql VARCHAR(500)DECLARE cur_delete_table CURSOR READ_ONLY FORWARD_ONLY FORSELECT name FROM sysobjects WHERE name LIKE 'PUB%' AN

从Java的jar文件中读取数据的方法

  这篇文章主要介绍了从Java的jar文件中读取数据的方法,实例分析了java档案文件的相关操作技巧,需要的朋友可以参考下 本文实例讲述了从Java的jar文件中读取数据的方法.分享给大家供大家参考.具体如下: Java 档案 (Java Archive, JAR) 文件是基于 Java 技术的打包方案.它们允许开发人员把所有相关的内容 (.class.图片.声音和支持文件等) 打包到一个单一的文件中.JAR 文件格式支持压缩.身份验证和版本,以及许多其它特性. 从 JAR 文件中得到它所包含