最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java 批量刪除html中注釋內(nèi)容的方法

 更新時間:2014年04月02日 08:55:18   作者:  
最近項目中有一個功能需要讀取外部html文本文件。但是有的html文件里面有大量的注釋,需要刪除其中的注釋在存儲

其實刪除html文本中的注釋有很多方法,這里就自己隨便寫了一個處理方法,權(quán)當(dāng)筆記,有需要的同學(xué)可以參考。

html文本的注釋有幾個特點:
1. 成對出現(xiàn),有開始就一定有結(jié)束。
2. 注釋標(biāo)簽沒有嵌套,注釋開始標(biāo)簽(以下稱為 <!--)下一個一定是其對應(yīng)的結(jié)束標(biāo)簽(以下稱為 -->)。
3. 一行中可能有多個注釋標(biāo)簽對兒。
4. 注釋也可以換行。
大致有以下幾種情況:

復(fù)制代碼 代碼如下:

<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. 如果該行中只包含<!-- 與 -->,并且<!-- 在 --> 之前。直接刪除兩標(biāo)簽之間的注釋內(nèi)容,獲取其他內(nèi)容。
3. 如果該行中只包含<!-- 與 -->,但是<!-- 在 --> 之后。獲取兩個標(biāo)簽之間的內(nèi)容,并且標(biāo)注已遇到<!--標(biāo)簽。
4. 如果該行中只包含<!--,獲取標(biāo)簽前面的內(nèi)容,并且標(biāo)注已遇到<!--標(biāo)簽。
5. 如果該行中只包含-->,獲取標(biāo)簽后面的內(nèi)容,并且標(biāo)注已遇到 --> 標(biāo)簽。
6. 對該行剩下的內(nèi)容再執(zhí)行2,3,4,5步驟。
7. 保存剩下的內(nèi)容。
8. 讀取下一行。

復(fù)制代碼 代碼如下:
    public class HtmlCommentHandler {
        /**
         * html內(nèi)容中注釋的Detector
         *
         * @author boyce
         * @version 2013-12-3
         */
        private static class HtmlCommentDetector {

            private static final String COMMENT_START = "<!--";
            private static final String COMMENT_END = "-->";

            // 該字符串是否是html注釋行,包含注釋的開始標(biāo)簽且結(jié)束標(biāo)簽"<!-- -->"
            private static boolean isCommentLine(String line) {

                return containsCommentStartTag(line) && containsCommentEndTag(line)
                    && line.indexOf(COMMENT_START) < line.indexOf(COMMENT_END);
            }

            // 是否包含注釋的開始標(biāo)簽
            private static boolean containsCommentStartTag(String line) {
                return StringUtils.isNotEmpty(line) &&
 line.indexOf(COMMENT_START) != -1;
            }

            // 是否包含注釋的結(jié)束標(biāo)簽
            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;
            }

            // 獲取開始注釋符號之前的內(nèi)容
            private static String getBeforeCommentContent(String line) {
                if (!containsCommentStartTag(line))
                    return line;

                return line.substring(0, line.indexOf(COMMENT_START));
            }

            // 獲取結(jié)束注釋行之后的內(nèi)容
            private static String getAfterCommentContent(String line) {
                if (!containsCommentEndTag(line))
                    return line;

                return line.substring(line.indexOf(COMMENT_END) + COMMENT_END.length());
            }
        }

        /**
         * 讀取html內(nèi)容,去掉注釋
         */
        public static String readHtmlContentWithoutComment(BufferedReader reader) throws IOException {
            StringBuilder builder = new StringBuilder();
            String line = null;

            // 當(dāng)前行是否在注釋中
            boolean inComment = false;
            while (ObjectUtils.isNotNull(line = reader.readLine())) {

                // 如果包含注釋標(biāo)簽
                while (HtmlCommentDetector.containsCommentStartTag(line) ||
                        HtmlCommentDetector.containsCommentEndTag(line)) {

                    // 將成對出現(xiàn)的注釋標(biāo)簽之間的內(nèi)容刪除
                    // <!-- comment -->
                    if (HtmlCommentDetector.isCommentLine(line)) {
                        line = HtmlCommentDetector.deleteCommentInLine(line);
                    }

                    // 如果不是注釋行,但是依然存在開始標(biāo)簽和結(jié)束標(biāo)簽,結(jié)束標(biāo)簽一定在開始標(biāo)簽之前
                    // xxx -->content<!--
                    else if (HtmlCommentDetector.containsCommentStartTag(line) && HtmlCommentDetector.containsCommentEndTag(line)) {
                        // 獲取結(jié)束標(biāo)簽之后,開始標(biāo)簽之前的文本,并且將 inComment設(shè)置為true
                        line = HtmlCommentDetector.getAfterCommentContent(line);
                        line = HtmlCommentDetector.getBeforeCommentContent(line);
                        inComment = true;
                    }

                    // 如果只存在開始標(biāo)簽,因為注釋標(biāo)簽不支持嵌套,只有開始標(biāo)簽的行一定不會inComment
                    // content <!--
                    else if (!inComment && HtmlCommentDetector.containsCommentStartTag(line)) {
                        // 將 inComment 設(shè)置為true。獲取開始標(biāo)簽之前的內(nèi)容
                        inComment = true;
                        line = HtmlCommentDetector.getBeforeCommentContent(line);
                    }

                    // 如果只存在結(jié)束標(biāo)簽,因為注釋標(biāo)簽不支持嵌套,只有結(jié)束標(biāo)簽的行一定inComment
                    // -->content
                    else if (inComment && HtmlCommentDetector.containsCommentEndTag(line)) {
                        // 將 inComment 設(shè)置為false。獲取結(jié)束標(biāo)簽之后的內(nèi)容
                        inComment = false;
                        line = HtmlCommentDetector.getAfterCommentContent(line);
                    }

                    // 保存該行非注釋的內(nèi)容
                    if (StringUtils.isNotEmpty(line))
                        builder.append(line);
                }

                // 保存該行不存在任何注釋標(biāo)簽的并且inComment = false的行
                if (StringUtils.isNotEmpty(line) && !inComment)
                    builder.append(line);
            }
            return builder.toString();
        }
    }

當(dāng)然,還有其他很多的方法,也可以通過正則匹配刪除,也可以通過Stack標(biāo)記開始結(jié)束。
等等,以上代碼經(jīng)過測試使用,希望對有需要的同學(xué)有用。

相關(guān)文章

  • 總結(jié)Java集合類操作優(yōu)化經(jīng)驗

    總結(jié)Java集合類操作優(yōu)化經(jīng)驗

    本文主要介紹的就是集合框架的使用經(jīng)驗,告訴大家如何高效、方便地管理對象,所有代碼基于JDK7,需要的朋友可以參考下
    2015-08-08
  • 詳解Struts2標(biāo)簽遍歷

    詳解Struts2標(biāo)簽遍歷

    這篇文章主要介紹了Struts2標(biāo)簽遍歷,以及相關(guān)的用法示例,需要的朋友可以參考下。
    2017-09-09
  • SpringBoot整合RestTemplate用法的實現(xiàn)

    SpringBoot整合RestTemplate用法的實現(xiàn)

    本篇主要介紹了RestTemplate中的GET,POST,PUT,DELETE、文件上傳和文件下載6大常用的功能,具有一定的參考價值,感興趣的可以了解一下
    2023-08-08
  • SpringBoot項目中@Test不出現(xiàn)可點擊運行的按鈕問題

    SpringBoot項目中@Test不出現(xiàn)可點擊運行的按鈕問題

    這篇文章主要介紹了SpringBoot項目中@Test不出現(xiàn)可點擊運行的按鈕問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • java讀寫oracle的blob字段示例

    java讀寫oracle的blob字段示例

    這篇文章主要介紹了java讀寫oracle的blob字段示例,需要的朋友可以參考下
    2014-02-02
  • Spring?Boot最經(jīng)典的20道面試題你都會了嗎

    Spring?Boot最經(jīng)典的20道面試題你都會了嗎

    Spring Boot是現(xiàn)代化的Java應(yīng)用程序開發(fā)框架,具有高度的靈活性和可擴(kuò)展性,下面這篇文章主要給大家介紹了關(guān)于Spring?Boot最經(jīng)典的20道面試題,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-06-06
  • SpringBoot實現(xiàn)基于URL和IP的訪問頻率限制

    SpringBoot實現(xiàn)基于URL和IP的訪問頻率限制

    在現(xiàn)代?Web?應(yīng)用中,接口被惡意刷新或暴力請求是一種常見的攻擊手段,為了保護(hù)系統(tǒng)資源,需要對接口的訪問頻率進(jìn)行限制,下面我們就來看看如何使用?Spring?Boot?實現(xiàn)基于?URL?和?IP?的訪問頻率限制吧
    2025-01-01
  • Hibernate5新特性介紹

    Hibernate5新特性介紹

    hibernate5中有了一些新的變動,下面腳本之家小編把Hibernate5新特性相關(guān)知識,分享到腳本之家平臺,感興趣的朋友參考下吧
    2017-09-09
  • Spring Cloud Alibaba使用Sentinel實現(xiàn)接口限流

    Spring Cloud Alibaba使用Sentinel實現(xiàn)接口限流

    這篇文章主要介紹了Spring Cloud Alibaba使用Sentinel實現(xiàn)接口限流,本文詳細(xì)的介紹了Sentinel組件的用法以及接口限流,感興趣的可以了解一下
    2019-04-04
  • Java用自帶的Image IO給圖片添加水印

    Java用自帶的Image IO給圖片添加水印

    本文主要介紹了如何采用Java自帶的Image IO實現(xiàn)圖片添加水印的需求,并整合了一些其他功能,感興趣的朋友可以參考下
    2021-06-06

最新評論

开化县| 衡东县| 罗城| 宜丰县| 定南县| 长宁区| 辉县市| 常州市| 桃园市| 页游| 绥化市| 高淳县| 阳谷县| 运城市| 南平市| 江孜县| 青冈县| 开原市| 陵水| 旬阳县| 太仆寺旗| 泸西县| 琼海市| 垫江县| 平江县| 赤壁市| 江陵县| 周宁县| 五家渠市| 永嘉县| 青河县| 伊金霍洛旗| 广德县| 长武县| 雷州市| 友谊县| 镇巴县| 凤山市| 阜新市| 临清市| 揭东县|