当前位置:  编程技术>java/j2ee

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

    来源: 互联网  发布时间:2014-11-05

    本文导语:  其实删除html文本中的注释有很多方法,这里就自己随便写了一个处理方法,权当笔记,有需要的同学可以参考。 html文本的注释有几个特点: 1. 成对出现,有开始就一定有结束。 2. 注释标签没有嵌套,注释开始标签(以下称...

其实删除html文本中的注释有很多方法,这里就自己随便写了一个处理方法,权当笔记,有需要的同学可以参考。

html文本的注释有几个特点:
1. 成对出现,有开始就一定有结束。
2. 注释标签没有嵌套,注释开始标签(以下称为 )。
3. 一行中可能有多个注释标签对儿。
4. 注释也可以换行。
大致有以下几种情况:

代码如下:

 
 
A Head 
 
A Div
 
a div
 
A span
 

A div
 
A span
 
 

思路:
1. 每次读取一行文本。
2. 如果该行中只包含,并且 之前。直接删除两标签之间的注释内容,获取其他内容。
3. 如果该行中只包含,但是 之后。获取两个标签之间的内容,并且标注已遇到,获取标签后面的内容,并且标注已遇到 --> 标签。
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 = "";

            // 该字符串是否是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)) {

                    // 将成对出现的注释标签之间的内容删除
                    //
                    if (HtmlCommentDetector.isCommentLine(line)) {
                        line = HtmlCommentDetector.deleteCommentInLine(line);
                    }

                    // 如果不是注释行,但是依然存在开始标签和结束标签,结束标签一定在开始标签之前
                    // xxx -->contentcontent
                    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命名空间javax.xml.ws注释类型webserviceref成员方法: type定义参考
  • 我没用过Java,请问各位大侠Java中除了/*...*/用作注释外,还有什么符号可用于注释符?
  • java命名空间javax.xml.ws注释类型webserviceref成员方法: name定义参考
  • linux下的java程序,到windows下看注释部分是乱码???
  • java命名空间javax.annotation注释类型resource的类成员方法: type定义及介绍
  • 如何读上万行的没有太多注释的Java源代码
  • java命名空间javax.annotation注释类型resource的类成员方法: name定义及介绍
  • 我想编程分析任意一个java文件,把其中的注释部分删掉,请帮我分析一下思路和方法好吗?
  • java命名空间javax.management注释类型mxbean的类成员方法: value定义及介绍
  • 我把JAVA和C++都搞混了,希望JAVA、C++爱好者给我讲讲里面的程序注释问题在JAVA和C++中都有哪些不同。
  • java命名空间java.lang注释类型suppresswarnings的类成员方法: value定义及介绍
  • 谁能给我一个Java读取XML的例子,最好有注释和说明,小弟想了解JSP和XML结合编程的一些东西,找不下资料?
  • java命名空间javax.jws注释类型webservice的类成员方法: endpointinterface定义及介绍
  • java命名空间javax.annotation注释类型generated的类成员方法: comments定义及介绍
  • java命名空间javax.xml.ws注释类型webserviceref成员方法: wsdllocation定义参考
  • java命名空间javax.jws注释类型webservice的类成员方法: targetnamespace定义及介绍
  • java命名空间java.beans注释类型constructorproperties的类成员方法: value定义及介绍
  • java命名空间javax.xml.bind.annotation注释类型xmlschematypes的类成员方法: value定义及介绍
  • java命名空间javax.xml.bind.annotation注释类型xmlelements的类成员方法: value定义及介绍
  • java命名空间javax.xml.bind.annotation.adapters注释类型xmljavatypeadapters的类成员方法: value定义及介绍
  • java命名空间javax.xml.bind.annotation注释类型xmlschematype的类成员方法: type定义及介绍
  • ■■投诉Java版主,您是MS的枪手,删除Java贴子,想要我们学.net吗?大家同意的,每人发贴子,一起UP,一起投诉!!!
  • java中如何建立与删除临时文件?
  • 怎么用JAVA删除一个给定的目录,并包括次目录下的文件。
  • java中文件删除后,有没有办法恢复?????
  • 大虾们帮我看看这个删除java的问题,很迷人的耶!!
  • 编写把一java程序中所有的print语句都删除,帮忙分析一下思路。
  • 在Java中如何删除一个文件??
  • 使用java怎样删除目录,
  • java中如何执行dos命令,如文件删除等(时间紧急)
  • unix/linux知识 iis7站长之家
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • java命名空间java.lang类runtime的类成员方法: runfinalization定义及介绍
  • Java中如何通过方法名动态调用方法?
  • java命名空间java.awt.im类inputcontext的类成员方法: getinputmethodcontrolobject定义及介绍
  • <%@ page import="java.lang.Math"%>后用round(float a)方法,怎么报找不到round方法?
  • java命名空间java.sql类types的类成员方法: java_object定义及介绍
  • java初学--在java中有个native本地方法 说是能嵌入c 不知道具体?
  • java命名空间java.lang类system的类成员方法: runfinalization定义及介绍
  • 在JAVA中只有一种派生子类的方法吗?我记得在C++ 中有3种派生方法的!
  • java命名空间java.lang类stacktraceelement的类成员方法: isnativemethod定义及介绍
  • java根据方法名称取得反射方法的参数类型示例
  • java命名空间java.lang类stacktraceelement的类成员方法: getmethodname定义及介绍
  • 请问java.sql包中 preparedStatement 对象的setString(int parameterIndex,java.lang.String x)方法怎么用?
  • java命名空间java.awt.im.spi接口inputmethod的类成员方法: dispose定义及介绍
  • java.util类对象的DATE方法为何不能用? <%=new java.util.date()%>,在页面中是这样写的,服务器用的是Resin.
  • java命名空间java.net类httpurlconnection的类成员方法: getrequestmethod定义及介绍
  • 有没有一种工具可以让java自动调出类的方法、成员?就像Delphi一样,写完Edit1.系统会跳出一些TEdit的属性、方法。
  • java命名空间java.security类policyspi的类成员方法: enginerefresh定义及介绍
  • 各位高手知道在JAVA中如何用一个名称创建一个对象实例,并调用其方法,注意:在编写代码时并不知要创建的对象的类名,也并不知方法名
  • java命名空间java.awt.im.spi接口inputmethod的类成员方法: getcontrolobject定义及介绍
  • java 与 C++ 实现后绑定的方法
  • java命名空间java.security类policy的类成员方法: refresh定义及介绍
  • 谁能告诉我哪里能找到java包内部类及方法使用介绍
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: imageflavor定义及介绍
  • 我想学JAVA ,是买THINK IN JAVA 还是JAVA2核心技术:卷1 好???
  • java命名空间java.lang.management类managementfactory的类成员方法: getcompilationmxbean定义及介绍
  • 请问Java高手,Java的优势在那里??,Java主要适合于开发哪类应用程序
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getlibrarypath定义及介绍
  • 如何将java.util.Date转化为java.sql.Date?数据库中Date类型对应于java的哪个Date呢
  • java命名空间java.lang.management接口runtimemxbean的类成员方法: getstarttime定义及介绍
  • 谁有电子版的《Java编程思想第二版(Thinking in java second)》和《Java2编程详解(special edition java2)》?得到给分
  • java命名空间java.awt.datatransfer类dataflavor的类成员方法: stringflavor定义及介绍




  • 特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3