欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

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

html文本的注釋有幾個特點:
1. 成對出現(xiàn),有開始就一定有結束。
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. 如果該行中只包含<!-- 與 -->,并且<!-- 在 --> 之前。直接刪除兩標簽之間的注釋內(nèi)容,獲取其他內(nèi)容。
3. 如果該行中只包含<!-- 與 -->,但是<!-- 在 --> 之后。獲取兩個標簽之間的內(nèi)容,并且標注已遇到<!--標簽。
4. 如果該行中只包含<!--,獲取標簽前面的內(nèi)容,并且標注已遇到<!--標簽。
5. 如果該行中只包含-->,獲取標簽后面的內(nèi)容,并且標注已遇到 --> 標簽。
6. 對該行剩下的內(nèi)容再執(zhí)行2,3,4,5步驟。
7. 保存剩下的內(nèi)容。
8. 讀取下一行。

復制代碼 代碼如下:
    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注釋行,包含注釋的開始標簽且結束標簽"<!-- -->"
            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;
            }

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

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

            // 獲取結束注釋行之后的內(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;

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

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

                    // 將成對出現(xiàn)的注釋標簽之間的內(nèi)容刪除
                    // <!-- 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。獲取開始標簽之前的內(nèi)容
                        inComment = true;
                        line = HtmlCommentDetector.getBeforeCommentContent(line);
                    }

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

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

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

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

相關文章

  • 實例解析Java程序中正則表達式的貪婪模式匹配

    實例解析Java程序中正則表達式的貪婪模式匹配

    貪婪模式又叫最大匹配,X?、X*、X+、X{n,}都是最大匹配,例如你要用“<.+>”去匹配“a<tr>aava </tr>abb”,也許你所期待的結果是想匹配“<tr>”,但是實際結果卻會匹配到“<tr>aava </tr>”,下面我們就來看具體看一下貪婪模式的使用.
    2016-05-05
  • 如何使用JFrame完成動態(tài)模擬時鐘

    如何使用JFrame完成動態(tài)模擬時鐘

    本文介紹了如何使用JFrame完成動態(tài)模擬時鐘,需要的朋友可以參考下
    2015-08-08
  • Java Unsafe學習筆記分享

    Java Unsafe學習筆記分享

    今天小編就為大家分享一篇Java Unsafe學習筆記,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • java基于線程池和反射機制實現(xiàn)定時任務完整實例

    java基于線程池和反射機制實現(xiàn)定時任務完整實例

    這篇文章主要介紹了java基于線程池和反射機制實現(xiàn)定時任務的方法,以完整實例形式較為詳細的分析了Java定時任務的功能原理與實現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-11-11
  • MyBatis框架中mybatis配置文件詳細介紹

    MyBatis框架中mybatis配置文件詳細介紹

    這篇文章主要介紹了MyBatis框架中mybatis配置文件詳細介紹,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2018-01-01
  • Spring Boot 整合 Apache Dubbo的示例代碼

    Spring Boot 整合 Apache Dubbo的示例代碼

    Apache Dubbo是一款高性能、輕量級的開源 Java RPC 框架,這篇文章主要介紹了Spring Boot 整合 Apache Dubbo的方法,本文通過示例說明給大家講解的非常詳細,需要的朋友可以參考下
    2021-07-07
  • spring boot使用RabbitMQ實現(xiàn)topic 主題

    spring boot使用RabbitMQ實現(xiàn)topic 主題

    本篇文章主要介紹了spring boot使用RabbitMQ實現(xiàn)topic 主題,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-03-03
  • java Swing實現(xiàn)選項卡功能(JTabbedPane)實例代碼

    java Swing實現(xiàn)選項卡功能(JTabbedPane)實例代碼

    這篇文章主要介紹了java Swing實現(xiàn)選項卡功能(JTabbedPane)實例代碼的相關資料,學習java 基礎的朋友可以參考下這個簡單示例,需要的朋友可以參考下
    2016-11-11
  • java多線程入門知識及示例程序

    java多線程入門知識及示例程序

    java多線程入門知識及示例程序,大家參考使用吧
    2013-12-12
  • 詳解Java中Array和ArrayList的比較和轉換

    詳解Java中Array和ArrayList的比較和轉換

    在 Java 編程中,arrays 和 arraylists 都是基本的數(shù)據(jù)結構,用來存放數(shù)據(jù)集合,雖然兩者的用途一樣,但是它們的特點極大地影響應用的性能和靈活性,本文探討 arrays 和 arraylists 的重要特性,它們各自的強項和弱點,,需要的朋友可以參考下
    2023-08-08

最新評論