Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 日本在线视频www色,中文字幕永久在线,国产91蝌蚪

          整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          如何解析html標簽內容?手寫正則表達式?htmlparser模塊幫你解決

          篇文章給大家介紹一個解析html內容的模塊——htmlparser。

          舉一個簡單的應用場景:假設有一天領導需要你收集一下線上頁面已存在的靜態資源鏈接(js、css、img),你們的頁面很多,而且每個頁面的代碼量很大(比如上萬行),這種情況下你總不能人肉去搜索,那么此時htmlparser這個模塊就可以派上用場了。

          簡單使用

          安裝命令

          npm install htmlparser

          圖1

          圖1中我們使用htmlparser模塊解析一個i.html文件,其內容如下:

          圖2

          解析結果如下:

          圖3

          圖3所示是個對象(此處序列化了便于顯示),遍歷這個對象就可以解決本文開頭所說的問題,這個模塊的用法非常的簡單。

          原理分析

          回到圖1,htmlparser模塊給我提供了一個Parser構造函數,這個構造函數是初始化的入口!它大概長這個樣子:

          function Parser(handler) {
             this._handler = handler;
          }

          Parser接受一個參數handler,這個handler必須是一個對象,這個對象必須定義以下幾個方法:

          • reset方法主要做一些重置工作;
          • done方法完成解析后調用,此處可以執行自定義回調函數;
          • writeTag方法處理tag標簽;
          • writeText方法處理純文本信息
          • writeComment方法處理注釋信息;
          • writeDirective方法處理<!...>這樣的標簽信息,比如<!DOCTYPE html>。

          圖1中我們使用的是模塊內部提供的DefaultHandler,我們當然也可以自己定義handler。用別人的handler有時并不能完全滿足自己的業務場景,那么我們操作一把,代碼如下:

          圖4

          圖4中我們自定義一個handler——CustomHandler,我們先運行一下看看各個方法都輸出了什么?

          圖5

          圖5中CustomHandler的各個方法按照原始字符串的順序依次打印出了每個解析結果,這些解析結果是parser對象為我們自動生成的,解析的原理就是正則匹配。我們可以在自定義handler的各個函數方法中做一些特殊處理,然后把最終的結果通過done函數輸出出去。

          圖4中的parseComplete方法也可以用以下邏輯代替,

          parser.reset();
          parser.parseChunk(html);
          parser.done();

          這個模塊除了可以在node環境中使用,它同時也可以在瀏覽器中使用,用法如下:

          圖6

          圖7

          注意,如果在瀏覽器中使用,模塊的所有API都掛在了Tautologistics.NodeHtmlParser這個對象上,其它用法一致。

          總結

          需要我們去解析html內容的場景非常多,之前我們更多的是使用自己寫的正則表達式去做,麻煩并且容易出錯。現在我們了解了htmlparser模塊,以后就可以直接使用它去解決問題。

          篇文章給大家介紹一個解析html內容的模塊——htmlparser。

          舉一個簡單的應用場景:假設有一天領導需要你收集一下線上頁面已存在的靜態資源鏈接(js、css、img),你們的頁面很多,而且每個頁面的代碼量很大(比如上萬行),這種情況下你總不能人肉去搜索,那么此時htmlparser這個模塊就可以派上用場了。

          簡單使用

          安裝命令

          npm install htmlparser

          圖1

          圖1中我們使用htmlparser模塊解析一個i.html文件,其內容如下:

          圖2

          解析結果如下:

          圖3

          圖3所示是個對象(此處序列化了便于顯示),遍歷這個對象就可以解決本文開頭所說的問題,這個模塊的用法非常的簡單。

          原理分析

          回到圖1,htmlparser模塊給我提供了一個Parser構造函數,這個構造函數是初始化的入口!它大概長這個樣子:

          function Parser(handler) {
             this._handler = handler;
          }

          Parser接受一個參數handler,這個handler必須是一個對象,這個對象必須定義以下幾個方法:

          • reset方法主要做一些重置工作;
          • done方法完成解析后調用,此處可以執行自定義回調函數;
          • writeTag方法處理tag標簽;
          • writeText方法處理純文本信息
          • writeComment方法處理注釋信息;
          • writeDirective方法處理<!...>這樣的標簽信息,比如<!DOCTYPE html>。

          圖1中我們使用的是模塊內部提供的DefaultHandler,我們當然也可以自己定義handler。用別人的handler有時并不能完全滿足自己的業務場景,那么我們操作一把,代碼如下:

          圖4

          圖4中我們自定義一個handler——CustomHandler,我們先運行一下看看各個方法都輸出了什么?

          圖5

          圖5中CustomHandler的各個方法按照原始字符串的順序依次打印出了每個解析結果,這些解析結果是parser對象為我們自動生成的,解析的原理就是正則匹配。我們可以在自定義handler的各個函數方法中做一些特殊處理,然后把最終的結果通過done函數輸出出去。

          圖4中的parseComplete方法也可以用以下邏輯代替,

          parser.reset();
          parser.parseChunk(html);
          parser.done();

          這個模塊除了可以在node環境中使用,它同時也可以在瀏覽器中使用,用法如下:

          圖6

          圖7

          注意,如果在瀏覽器中使用,模塊的所有API都掛在了Tautologistics.NodeHtmlParser這個對象上,其它用法一致。

          總結

          需要我們去解析html內容的場景非常多,之前我們更多的是使用自己寫的正則表達式去做,麻煩并且容易出錯。現在我們了解了htmlparser模塊,以后就可以直接使用它去解決問題。

          、匹配HTML開始標簽及結束標簽

          這段正則,為什么比網上搜索的復雜一些呢?主要是加了匹配特測情況的問題,避免BUG。

          舉例:<div debug=">" ></div>

          const reg_tags = /<((["'])+.*?|[^>])+>/g;

          開始和結束

          2、匹配HTML開始標簽

          const reg_tag_start = /<[^\\/]((["'])+.*?|[^>])+>/

          開始

          3、匹配HTML結束標簽

          const reg_tag_end = /<[\\/]+[^<>]*>*/

          結束


          4、匹配HTML標簽屬性

          const reg_tag_attrs = /(?<=\s)[\w:-]+(=(["']).*?)*/g;

          標簽屬性

          5、獲取HTML標簽屬性名與值

          const reg_tag_attr_info = /(^[^=]+|(?<=(['"])).*?(?=))/g;

          屬性名與值

          6、獲取HTML標簽的名稱

          const reg_tag_name = /(?<=<[\/\s]*)\w+(?=(\s+(?![\s=])|>))/;

          標簽名稱

          7、匹配HTML文檔類型聲明

          const reg_doctype = /<!doctype[^<>]*>*/i

          聲明

          8、匹配HTML文檔注釋

          const reg_tag_note = /<\!.*?>/

          注釋

          9、匹配HTML文本內容

          const reg_text = /(?<=<[\w]+.*?>)[\s\S]*?(?=</[\w]*?>)/

          文本


          10、其它

          //g 正則表達式后面加g,表示全局匹配。

          //i 正則表達式后面加i,表示不區分大小寫。

          [\u4e00-\u9fa5],表示匹配中文。

          中文

          [^\x00-\xff\u4e00-\u9fa5],表示匹配中文符號

          中文符號


          以上正則表達式,是在寫一個生成HTML抽象語法樹的工具時,不斷摸索出來。如果您有更好的寫法,歡迎交流。


          人人為我,我為人人,歡迎您的瀏覽,我們一起加油吧。


          主站蜘蛛池模板: 激情久久av一区av二区av三区| 精品一区二区三区在线播放视频| 中文字幕日韩一区二区不卡| 国产伦精品一区二区三区四区| 日韩精品成人一区二区三区| 高清一区二区三区视频| 久久久精品人妻一区亚美研究所 | 日韩精品一区二区三区在线观看l| 日本亚洲成高清一区二区三区| 无码人妻AⅤ一区二区三区水密桃| 69福利视频一区二区| 日本一区二区不卡视频| 国产亚洲一区二区精品| 国产精品乱码一区二区三区| 午夜精品一区二区三区在线观看| 精品日韩一区二区| 韩国精品一区视频在线播放 | 亚洲日韩中文字幕一区| 人体内射精一区二区三区| 国偷自产Av一区二区三区吞精| 日本一区二区三区免费高清在线| 在线电影一区二区三区| 国模视频一区二区| 国产精品亚洲一区二区三区在线观看| 亚洲日本久久一区二区va| 亚洲一区二区三区久久| 色一乱一伦一图一区二区精品| 久久精品免费一区二区三区| 国产一区二区内射最近更新| 手机看片福利一区二区三区| 久久中文字幕一区二区| 国产AV一区二区三区无码野战| 亚洲一区二区三区香蕉| 成人日韩熟女高清视频一区| 无码国产精品一区二区免费式芒果| 日韩精品一区二区三区中文| 亚洲一区二区三区不卡在线播放| 国产精品无码一区二区在线观 | 色噜噜狠狠一区二区| 亚洲欧美国产国产综合一区| 日本一区二区三区在线看|