国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

香港云服务器
服務(wù)器之家 - 編程語言 - JAVA教程 - Java 批量刪除html中注釋內(nèi)容的方法

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

2019-11-17 14:16java教程網(wǎng) JAVA教程

最近項(xiàng)目中有一個(gè)功能需要讀取外部html文本文件。但是有的html文件里面有大量的注釋,需要?jiǎng)h除其中的注釋在存儲(chǔ)

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

html文本的注釋有幾個(gè)特點(diǎn): 
1. 成對(duì)出現(xiàn),有開始就一定有結(jié)束。 
2. 注釋標(biāo)簽沒有嵌套,注釋開始標(biāo)簽(以下稱為 <!--)下一個(gè)一定是其對(duì)應(yīng)的結(jié)束標(biāo)簽(以下稱為 -->)。 
3. 一行中可能有多個(gè)注釋標(biāo)簽對(duì)兒。 
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. 如果該行中只包含<!-- 與 -->,但是<!-- 在 --> 之后。獲取兩個(gè)標(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. 對(duì)該行剩下的內(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;
            }

            // 獲取開始注釋符號(hào)之前的內(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)) {

                    // 將成對(duì)出現(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)簽,因?yàn)樽⑨寴?biāo)簽不支持嵌套,只有開始標(biāo)簽的行一定不會(huì)inComment
                    // content <!--
                    else if (!inComment && HtmlCommentDetector.containsCommentStartTag(line)) {
                        // 將 inComment 設(shè)置為true。獲取開始標(biāo)簽之前的內(nèi)容
                        inComment = true;
                        line = HtmlCommentDetector.getBeforeCommentContent(line);
                    }

                    // 如果只存在結(jié)束標(biāo)簽,因?yàn)樽⑨寴?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)過測試使用,希望對(duì)有需要的同學(xué)有用。

延伸 · 閱讀

精彩推薦
322
主站蜘蛛池模板: 国产精品美女久久久久av麻豆 | 亚洲成人av | 亚洲一区二区三 | 欧美激情一区二区 | 成年免费视频黄网站在线观看 | 欧美成人激情视频 | 国产精品久久久久国产a级 成人a在线视频 | 免费黄色在线观看 | 国产色综合视频 | 久久久久久亚洲一区二区三区蜜臀 | av一区久久 | 黄色国产视频 | 亚洲精品久久 | 久久三区| 精品亚洲一区二区 | 久久午夜羞羞影院免费观看 | 91一区二区 | 在线观看的av | 国产成人精品一区二区三区视频 | 国产日韩一级片 | 国产成人精品a视频一区www | 一区二区三区av | 久久久久久一级片 | 日本成人中文字幕 | 日韩欧美中文字幕在线视频 | 亚洲精品麻豆 | 国产毛片av| 亚洲国产精品一区二区三区 | 免费高清av| 韩日一区二区 | 久久精品成人 | 级毛片| 成人a在线视频免费观看 | 国产精品毛片在线 | 欧美性久久 | 成人午夜精品 | 免费成人av片 | 精精国产xxxx视频在线野外 | 国产精品久久久久久婷婷天堂 | 伊人伊成久久人综合网站 | 亚洲一区二区三区四区的 |