精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

移除注釋的完善思路:真的可以用正則實現?

開發 前端
網上有很多自稱能實現移除JS注釋的正則表達式,實際上存在種種缺陷。這使人多少有些愕然,也不禁疑惑到:真的可以用正則實現嗎?而本篇文章以使用正則移除JS注釋為目標,通過實踐,由淺及深,遇到問題解決問題,一步步看看到底能否用正則實現!

移除注釋的完善思路:真的可以用正則實現?

導語

網上有很多自稱能實現移除JS注釋的正則表達式,實際上存在種種缺陷。這使人多少有些愕然,也不禁疑惑到:真的可以用正則實現嗎?而本篇文章以使用正則移除JS注釋為目標,通過實踐,由淺及深,遇到問題解決問題,一步步看看到底能否用正則實現!

移除注釋的完善思路:真的可以用正則實現?

1 單行注釋

單行注釋要么占據一整行,要么處于某一行的***。

正常情況下不難,直接通過正則匹配,再用replace方法移除便可。 

  1. let codes = `  
  2.   let name = "Wmaker"; // This is name 
  3.   if (name) {  
  4.     // Print name 
  5.     console.log("His name is:"name);  
  6.   }  
  7. `;  
  8.  
  9.  
  10. console.log( codes.replace(/\/\/.*$/mg, '') );  
  11.  
  12. // 打印出:  
  13. // let name = "Wmaker";   
  14. // if (name) {  
  15. //     
  16. //   console.log("His name is:"name);  
  17. // } 

上面是成功的刪除了注釋,不過對于獨占一整行的注釋清理的不夠徹底,會留下空白行。實際上,行尾注釋前面的空白也被保留了下來。所以目標稍稍提高,清除這些空白。操作起來也并不難,思路大致這樣:刪除整行,實際上是刪除本行末尾的換行符或上一行末尾的換行符。而換行符本身也屬于空白符。所以只需操作正則,匹配到注釋以及注釋前面所有的空白符即可,一箭雙雕。 

  1. let codes = `  
  2.   let name = "Wmaker"; // This is name 
  3.   if (name) {  
  4.     // Print name 
  5.     console.log("His name is:"name);  
  6.   }  
  7. `;   
  8.  
  9. console.log( codes.replace(/\s*\/\/.*$/mg, '') );  
  10.  
  11. // 打印出:  
  12. // let name = "Wmaker" 
  13. // if (name) {  
  14. //   console.log("His name is:"name);  
  15. // } 

如果在字符串中出現完整的URL地址,上面的正則會直接匹配而將其刪除。網上大多會將URL的格式特征(http://xxx):雙下劃線前面有冒號,作為解決途徑加以利用。但這只是治標不治本的做法,畢竟//以任何形式出現在字符串中是它的自由,我們無從干涉。

這樣問題就轉變成:如何使正則匹配存在于引號外的雙下劃線?

想匹配被引號包圍,帶有雙下劃線的代碼塊比較簡單:/".*\/\/.*"/mg。難點在于如何實現這個否定,即當正則匹配到雙下劃線后,再判斷其是否在引號里面?絞盡腦汁,也上網查了很多,都沒有像樣的結果。靜心平氣,洗把臉刷刷牙再沖個頭冷靜之后,覺得單純使用正則的路已經走不通了,得跳出這個圈。

就在***關頭,在那淫穢污濁的房間上方突然光芒萬丈。我急忙護住了充滿血絲的眼睛,靜待其適應后定睛一看。只見那里顯現出了一段文字(Chinese):孩兒啊,先將帶有//被引號包圍的字符串替換掉,去掉注釋后再還原,不就行了嗎? 

  1. let codes = `  
  2.   let name = "Wmaker"; // This is name 
  3.   if (name) {  
  4.     // Print name 
  5.     console.log("His name is:"name);  
  6.     console.log("Unusual situation, characters of // in quotation marks.");  
  7.   }  
  8. `;   
  9.  
  10. // 之前的方式。  
  11. console.log( codes.replace(/\s*\/\/.*$/mg, '') );  
  12. // 打印出:  
  13. // let name = "Wmaker"
  14. // if (name) {  
  15. //   console.log("His name is:"name);  
  16. //   console.log("Unusual situation, characters of  
  17. // }   
  18.  
  19. // 現在的方式。  
  20. console.log( removeComments(codes) );  
  21. // 打印出: 
  22. // let name = "Wmaker" 
  23. // if (name) {  
  24. //   console.log("His name is:"name);  
  25. //   console.log("Unusual situation, characters of // in quotation marks.");  
  26. // }  
  27.  
  28. function removeComments(codes) {  
  29.   let {replacedCodes, matchedObj} = replaceQuotationMarksWithForwardSlash(codes);  
  30.  
  31.   replacedCodes = replacedCodes.replace(/\s*\/\/.*$/mg, '');  
  32.   Object.keys(matchedObj).forEach(k => {  
  33.     replacedCodes = replacedCodes.replace(k, matchedObj[k]);  
  34.   });  
  35.  
  36.   return replacedCodes;  
  37.  
  38.   function replaceQuotationMarksWithForwardSlash(codes) {  
  39.     let matchedObj = {};  
  40.     let replacedCodes = ''     
  41.  
  42.     let regQuotation = /".*\/\/.*"/mg;  
  43.     let uniqueStr = 'QUOTATIONMARKS' + Math.floor(Math.random()*10000);  
  44.  
  45.     let index = 0;  
  46.     replacedCodes = codes.replace(regQuotation, function(match) {  
  47.       let s = uniqueStr + (index++);  
  48.       matchedObj[s] = match;  
  49.       return s;  
  50.     });  
  51.  
  52.     return { replacedCodes, matchedObj };  
  53.   }  

是的,目標達成了,老天眷顧啊!

另外,有一個需要優化的地方:定義字符串的方式有三種 ' " ` ,目前我們只匹配了雙引號。

為了避免正則的記憶功能,都使用了正則字面量進行測試。

--- 之前 

  1. console.log( /".*\/\/.*"/mg.test(`'Unu//sual'`) ); // false  
  2. console.log( /".*\/\/.*"/mg.test(`"Unu//sual"`) ); // true  
  3. console.log( /".*\/\/.*"/mg.test(`\`Unu//sual\``) ); // false 

--- 之后 

  1. console.log( /('|"|`).*\/\/.*\1/mg.test(`'Unu//sual'`) ); // true  
  2. console.log( /('|"|`).*\/\/.*\1/mg.test(`"Unu//sual"`) ); // true  
  3. console.log( /('|"|`).*\/\/.*\1/mg.test(`\`Unu//sual\``) ); // true 

啊!問題到此結束了!

真的結束了嗎?不!我看了看時間:02:17,然后將眼鏡摘下,扯了張紙巾,拭去了幾顆淚水。

以下是接連解決的兩個問題:貪婪模式和轉義字符。 

  1. --- STEP 1,由于正則的貪婪模式導致。 
  2. let codes = ` 
  3.   let str = 'abc//abc'; // abc' 
  4. `; 
  5. console.log( codes.match(/('|"|`).*\/\/.*\1/mg) ); // ["'abc//abc'; // abc'"] 
  6.  
  7. -- 解決  
  8. let codes = ` 
  9.   let str = 'abc//abc'; // abc' 
  10. `; 
  11. console.log( codes.match(/('|"|`).*?\/\/.*?\1/mg) ); // ["'abc//abc'"]  
  12.  
  13. --- STEP 2,由定義字符串時其中的轉義字符導致。 
  14. let codes = ` 
  15.   let str = 'http://x\\'x.com'; // 'acs 
  16. `; 
  17. console.log( codes.match(/('|"|`).*?\/\/.*?\1/mg) ); // ["'http://x\'", "'; // '"] 
  18.  
  19. -- 解決  
  20. let reg = /(?<!\\)('|"|`).*?\/\/.*?(?<!\\)\1/mg; 
  21. let codes = ` 
  22.   let str = 'http://x\\'x.com'; // 'acs 
  23. `; 
  24. console.log( codes.match(reg) ); // ["'http://x\'x.com'"

事情到這里,雖然勞累,但多少有些成就感,畢竟成功了。

可是,可是,可是在測試時,竟然無意間發現一個無法逾越的障礙。就好比費勁千辛萬苦花費無盡的財力物力之后,某某尤物終于愿意一同去情人旅館時,卻發現家家爆滿,沒有空余的房間。在強裝歡笑,玩命的哄騙著她,一家接連一家的尋找直到終于定到房間后,卻發現自己已然挺不起來了!

正則會將任意位置的引號作為查找的起始位置,它不在乎引號是成雙的道理。下面是一個示例。 

  1. let reg = /(?<!\\)('|"|`).*?\/\/.*?(?<!\\)\1/mg;  
  2. let codes = `  
  3.   let str = "abc"; // "  
  4. `;  
  5. console.log( codes.match(reg) ); // [""abc"; // ""] 

不過,問題好歹在補過覺之后的 06:37 時得以解決。

思路是這樣的:雖然不能正確實現匹配帶有//被引號包圍的代碼塊(可能有方法,但能力有限),但是簡化成匹配單純被引號包圍的代碼塊,是簡單而且能正確做到的,雖然耗費的內存多了一些。另外,兩引號間也可能包含換行符,所以為其增加s模式:.代表全部字符。下面是去除單行注釋的最終代碼。 

  1. let codes = `  
  2.   let name = "Wmaker"; // This is name 
  3.   let str = 'http://x\\'x.com' + " / / " + '/"/"/'; // '; // " "  
  4.   if (name) {  
  5.     // Print name 
  6.     console.log("His name is:"name);  
  7.     console.log("Unusual situation, characters of // in quotation marks.");  
  8.   } 
  9. `;  
  10.  
  11. console.log(removeComments(codes));  
  12. // 打印出:  
  13. // let name = "Wmaker" 
  14. // let str = 'http://x\'x.com' + " / / " + '/"/"/' 
  15. // if (name) {  
  16. //   console.log("His name is:"name);  
  17. //   console.log("Unusual situation, characters of // in quotation marks.");  
  18. // } 
  19.  
  20. function removeComments(codes) {  
  21.   let {replacedCodes, matchedObj} = replaceQuotationMarksWithForwardSlash(codes);   
  22.   replacedCodes = replacedCodes.replace(/\s*\/\/.*$/mg, '');  
  23.   Object.keys(matchedObj).forEach(k => {  
  24.     replacedCodes = replacedCodes.replace(k, matchedObj[k]);  
  25.   });  
  26.  
  27.   return replacedCodes;  
  28.  
  29.   function replaceQuotationMarksWithForwardSlash(codes) {  
  30.     let matchedObj = {};  
  31.     let replacedCodes = ''    
  32.  
  33.     let regQuotation = /(?<!\\)('|"|`).*?(?<!\\)\1/smg;  
  34.     let uniqueStr = 'QUOTATIONMARKS' + Math.floor(Math.random()*10000);  
  35.  
  36.     let index = 0;  
  37.     replacedCodes = codes.replace(regQuotation, function(match) {  
  38.       let s = uniqueStr + (index++);  
  39.       matchedObj[s] = match;  
  40.       return s;  
  41.     });  
  42.  
  43.     return { replacedCodes, matchedObj };  
  44.   }  

***補充一點,單雙引號雖然也可以多行顯示,但其解析后實際是單行的。 

  1. let codes = "' \  
  2.   Wmaker \  
  3. '";  
  4. codes.match( /(?<!\\)('|"|`).*?(?<!\\)\1/smg ); // ["'   Wmaker '"] 

2 多行注釋

啊!難點已經解決,現在就可以悠哉悠哉的往前推進了。

多行注釋與單行思路相同,只需在刪除注釋時多加一個匹配模式。中和兩者的最終代碼如下。 

  1. let codes = `  
  2.   let name = "Wmaker"; // This is name 
  3.   let str = 'http://x\\'x.com' + " / / " + '/"/"/'; // '; // " "  
  4.   let str = 'http://x\\'x./*a*/com' + " / / " + '/"/"/'; // '; // "/*sad*/ "  
  5.   if (name) {  
  6.     // Print name 
  7.     /* Print name. */  
  8.     console.log("His name is:"name);  
  9.     console.log("Unusual situation, characters of // in quotation marks.");  
  10.     /*  
  11.      * Others test.  
  12.      */  
  13.     console.log("Unusual situation, characters of /* abc */ in quotation marks.");  
  14.   }  
  15. `;   
  16.  
  17. console.log(removeComments(codes));  
  18. // 打印出:  
  19. // let name = "Wmaker" 
  20. // let str = 'http://x\'x.com' + " / / " + '/"/"/' 
  21. // let str = 'http://x\'x./*a*/com' + " / / " + '/"/"/' 
  22. // if (name) {  
  23. //   console.log("His name is:"name);  
  24. //   console.log("Unusual situation, characters of // in quotation marks.");  
  25. //   console.log("Unusual situation, characters of /* abc */ in quotation marks."); 
  26. // }  
  27.  
  28. function removeComments(codes) {  
  29.   let {replacedCodes, matchedObj} = replaceQuotationMarksWithForwardSlash(codes);  
  30.  
  31.   replacedCodes = replacedCodes.replace(/(\s*\/\/.*$)|(\s*\/\*[\s\S]*?\*\/)/mg, '');  
  32.   Object.keys(matchedObj).forEach(k => {  
  33.     replacedCodes = replacedCodes.replace(k, matchedObj[k]);  
  34.   }); 
  35.  
  36.   return replacedCodes;  
  37.   function replaceQuotationMarksWithForwardSlash(codes) {  
  38.     let matchedObj = {};  
  39.     let replacedCodes = ''     
  40.  
  41.     let regQuotation = /(?<!\\)('|"|`).*?(?<!\\)\1/smg;  
  42.     let uniqueStr = 'QUOTATIONMARKS' + Math.floor(Math.random()*10000);  
  43.  
  44.     let index = 0;  
  45.     replacedCodes = codes.replace(regQuotation, function(match) {  
  46.     let s = uniqueStr + (index++);  
  47.     matchedObj[s] = match;  
  48.     return s;  
  49.     });  
  50.     return { replacedCodes, matchedObj };  
  51.   }  

3 總結

從以上可以得出結論,單純使用正則表達式是不能達到目標的,需要配合其它操作才行。但現在得出的結果真的能覆蓋全部的情況?會不會有其它的隱藏問題,比如多字節字符的問題。雖然作為一個碼農,該有的自信不會少,但慢慢的也明白了自己的局限性。從網上的其它資料看,使用UglifyJS,或在正確的解析中去除注釋,會更為穩妥。但有可能自己動手解決的,沒理由不花費些精力試試!

問題更新記錄

感謝熱心同志找出的錯誤,我會將能改與不能改的都列于此地,并只會更新下面兩個示例的代碼。

1.沒有考慮正則字面量中的轉義字符。

出錯示例:var reg=/a\//;。

修改方式:將刪除注釋的正則改為:/(\s*(?<!\\)\/\/.*$)|(\s*(?<!\\)\/\*[\s\S]*?(?<!\\)\*\/)/mg。

這里是工作于前端頁面的代碼及相應示例,下載鏈接。 

  1. <!DOCTYPE html>  
  2. <html> 
  3.  
  4. <head>  
  5.   <meta charset="UTF-8" 
  6.   <title>Remove Comments</title>  
  7. </head>  
  8.  
  9. <body>  
  10.   <p>輸入:</p>  
  11.   <textarea id="input" cols="100" rows="12"></textarea>  
  12.  
  13.   <br /><br />  
  14.   <button onclick="transform()">轉換</button>  
  15.  
  16.   <p>輸出:</p>  
  17.   <textarea id="output" cols="100" rows="12"></textarea>    
  18.  
  19.   <script>  
  20.     let input = document.querySelector('#input');  
  21.     let output = document.querySelector('#output');  
  22.  
  23.     setDefaultValue();  
  24.  
  25.     function transform() {  
  26.       output.value = removeComments(input.value);  
  27.     } 
  28.  
  29.     function removeComments(codes) {  
  30.       let {replacedCodes, matchedObj} = replaceQuotationMarksWithForwardSlash(codes);  
  31.  
  32.       replacedCodes = replacedCodes.replace(/(\s*(?<!\\)\/\/.*$)|(\s*(?<!\\)\/\*[\s\S]*?(?<!\\)\*\/)/mg, '');  
  33.       Object.keys(matchedObj).forEach(k => { 
  34.        replacedCodes = replacedCodes.replace(k, matchedObj[k]);  
  35.       });  
  36.  
  37.       return replacedCodes;  
  38.  
  39.       function replaceQuotationMarksWithForwardSlash(codes) {  
  40.         let matchedObj = {};  
  41.         let replacedCodes = ''         
  42.  
  43.         let regQuotation = /(?<!\\)('|"|`).*?(?<!\\)\1/smg;  
  44.         let uniqueStr = 'QUOTATIONMARKS' + Math.floor(Math.random()*10000);  
  45.  
  46.         let index = 0;  
  47.         replacedCodes = codes.replace(regQuotation, function(match) {  
  48.           let s = uniqueStr + (index++);  
  49.           matchedObj[s] = match;  
  50.           return s;  
  51.         });  
  52.  
  53.         return { replacedCodes, matchedObj };  
  54.       }  
  55.     }  
  56.  
  57.     function setDefaultValue() {  
  58.       input.value = `let name = "Wmaker"; // This is name 
  59. let str = 'http://x\\'x.com' + " / / " + '/"/"/'; // '; // " "  
  60. let str = 'http://x\\'x./*a*/com' + " / / " + '/"/"/'; // '; // "/*sad*/ "  
  61. if (name) {  
  62.   // Print name 
  63.   /* Print name. */  
  64.   console.log("His name is:"name);  
  65.   console.log("Unusual situation, characters of // in quotation marks.");  
  66.   /*  
  67.    * Others test.  
  68.    */  
  69.   console.log("Unusual situation, characters of /* abc */ in quotation marks."); 
  70.   
  71. `;  
  72.     }  
  73.   </script>  
  74. </body>  
  75. </html> 

這里是工作于Node端的代碼及相應示例,下載鏈接。運行命令:node 執行文件 待轉譯文件 轉移后文件。 

  1. const fs = require('fs');  
  2. const path = require('path');  
  3. const process = require('process');  
  4.  
  5. let sourceFile = process.argv[2];  
  6. let targetFile = process.argv[3];  
  7. if (!sourceFile || !targetFile) {  
  8.   throw new Error('Please set source file and target file.');  
  9.  
  10. sourceFile = path.resolve(__dirname, sourceFile);  
  11. targetFile = path.resolve(__dirname, targetFile);  
  12.  
  13. fs.readFile(sourceFile, 'utf8', (err, data) => {  
  14.   if (err) throw err; 
  15. fs.writeFile(targetFile, removeComments(data), 'utf8', (err, data) => {  
  16.     if (err) throw err;  
  17.     console.log('Remove Comments Done!');  
  18.   });  
  19. });  
  20.  
  21. function removeComments(codes) {  
  22.   let {replacedCodes, matchedObj} = replaceQuotationMarksWithForwardSlash(codes);  
  23.  
  24.   replacedCodes = replacedCodes.replace(/(\s*(?<!\\)\/\/.*$)|(\s*(?<!\\)\/\*[\s\S]*?(?<!\\)\*\/)/mg, '');  
  25.   Object.keys(matchedObj).forEach(k => {  
  26.     replacedCodes = replacedCodes.replace(k, matchedObj[k]);  
  27.   }); 
  28.   
  29.   return replacedCodes; 
  30.  
  31.   function replaceQuotationMarksWithForwardSlash(codes) {  
  32.     let matchedObj = {};  
  33.     let replacedCodes = ''      
  34.  
  35.     let regQuotation = /(?<!\\)('|"|`).*?(?<!\\)\1/smg;  
  36.     let uniqueStr = 'QUOTATIONMARKS' + Math.floor(Math.random()*10000);  
  37.  
  38.     let index = 0;  
  39.     replacedCodes = codes.replace(regQuotation, function(match) {  
  40.       let s = uniqueStr + (index++);  
  41.       matchedObj[s] = match;  
  42.       return s;  
  43.     });  
  44.  
  45.     return { replacedCodes, matchedObj };  
  46.   }  
責任編輯:龐桂玉 來源: segmentfault
相關推薦

2022-09-20 15:33:35

JavaScriptCSS編程

2021-11-16 12:25:14

jsPPT前端

2020-07-24 09:40:04

C語言OOP代碼

2018-07-31 10:20:54

WindowsDocker Linux

2012-02-08 09:28:59

無線網絡Wi-FiRuckus

2023-10-24 08:25:20

TCC模式事務

2011-01-04 14:27:50

安裝linux方法

2011-01-21 13:56:44

SendmailSolaris

2022-06-06 12:02:23

代碼注釋語言

2023-04-03 08:26:01

systemd運維

2009-12-03 10:27:12

FreeBSD路由器Snort

2017-10-11 16:16:29

弱電pvc管穿線

2011-06-17 14:36:50

Linux

2020-07-16 08:32:16

JavaScript語言語句

2010-04-02 15:36:37

Oracle約束

2022-11-21 10:28:13

FlutterPython

2023-08-22 09:00:00

人工智能Fashion-AI

2015-04-27 11:09:53

GoogleQUIC互聯網協議

2020-11-03 07:43:24

MQ版本號程序員

2018-06-04 08:52:13

LinuxIP工具
點贊
收藏

51CTO技術棧公眾號

欧美男男freegayvideosroom| 亚洲精品字幕在线| 狠狠综合久久av一区二区蜜桃 | 国产99在线播放| 精品无码久久久久| 亚州综合一区| 欧美视频你懂的| 法国空姐在线观看免费| 视频一区二区免费| 欧美a级理论片| 欧美精品做受xxx性少妇| 玖玖爱在线精品视频| 日韩精品第一| 伊人一区二区三区| 久久伊人资源站| 乱子伦一区二区三区| 亚洲乱码在线| 国产视频一区在线| 四季av一区二区三区| 激情小说 在线视频| 久久99国产精品麻豆| 97色在线视频观看| 91精品少妇一区二区三区蜜桃臀| 77成人影视| 日本韩国精品在线| 青春草国产视频| 国产黄色片在线观看| 丰满白嫩尤物一区二区| 亚洲国产综合在线| 国内视频一区| 免费在线观看一级片| 欧美一级二级三级视频| 福利电影一区二区三区| 欧美系列电影免费观看| 午夜欧美在线一二页| 亚洲精品人成| 亚洲色图21p| 国内精品久久久久影院色| 性欧美长视频免费观看不卡| 登山的目的在线| 国产欧美日韩在线一区二区| 精品国产乱码久久久久久老虎| 免费一区二区三区在线观看 | 97超碰免费在线| 久久久xxx| 欧美激情区在线播放| 蜜桃视频免费观看一区| 精品国产麻豆免费人成网站| 国产伦精品一区二区三区四区视频_| 亚洲成人久久精品| 久久久久在线| 国内成人精品视频| 黄色工厂在线观看| 国产精品一线| 日韩欧美一级二级三级久久久| 日韩一级理论片| 日韩在线免费电影| 国产精品色一区二区三区| 就去色蜜桃综合| 五十路在线视频| 成人黄页在线观看| 91综合久久一区二区| 精品久久久久久久久久久久| 桥本有菜av在线| 国产在线观看免费网站| 久久免费视频色| 裸体丰满少妇做受久久99精品| 人妻少妇精品无码专区久久| 韩国欧美国产一区| 91影视免费在线观看| 91精品国产高清一区二区三密臀| 三级小说欧洲区亚洲区| 日韩精品欧美激情| 日韩一级视频在线观看| 国产精品中文| 日韩欧美黄色影院| 99精品一区二区三区无码吞精| 57pao国产一区二区| 欧美精品一区二区三区蜜桃视频| 人人爽人人av| 成人黄色免费短视频| 久久人人97超碰com| 日本在线播放不卡| 欧美激情办公室videoshd| 亚洲欧洲www| 国产91视频一区| 蜜臀av在线| 精品电影在线观看| 亚洲综合色在线观看| 成人短视频软件网站大全app| 欧美一区二区日韩一区二区| 欧美久久久久久久久久久| 久久91在线| 亚洲人成电影网站色…| 青青操在线视频观看| 欧美日韩成人| 欧美一区二区三区……| 中文字幕在线观看国产| 国产成人在线视频免费播放| 久久精品二区| 日本www在线观看视频| 亚洲制服丝袜在线| 欧美一级片中文字幕| 国产精品麻豆| 日韩精品免费观看| 午夜激情视频在线播放| 亚洲精品免费观看| 国产精品美女主播在线观看纯欲| www.看毛片| 久久色在线视频| 99re99热| 国产精品专区免费| 91精品国产色综合久久久蜜香臀| 中文字幕一区二区人妻电影丶| 成人区精品一区二区婷婷| 欧美国产精品va在线观看| 无码人妻精品一区二区蜜桃色欲| 国产裸体歌舞团一区二区| 免费在线国产精品| 色呦呦视频在线观看| 在线观看区一区二| 一边摸一边做爽的视频17国产| 91一区二区| 欧美中文在线免费| 亚洲国产av一区二区| 中文成人av在线| 中文字幕无码精品亚洲35| 91麻豆精品国产91久久久更新资源速度超快| 亚洲国产精品电影| 老湿机69福利| 美女一区二区三区在线观看| 精品免费国产| 欧美人体视频xxxxx| 欧美日韩黄色影视| 国精产品一区二区三区| 亚洲黄页一区| 91免费看蜜桃| 午夜在线小视频| 日本高清不卡一区| 波多野结衣有码| 欧美福利影院| 成人av在线网址| 福利小视频在线观看| 欧美日韩免费一区| 漂亮人妻被黑人久久精品| 欧美在线1区| 成人久久精品视频| 五月天婷婷在线视频| 91久久精品网| 91精品人妻一区二区| 亚洲尤物精选| 久久国产手机看片| 日本在线啊啊| 日韩经典中文字幕| www.日本精品| 91毛片在线观看| 久久成人免费观看| 日韩有码av| 热99精品里视频精品| 天堂a中文在线| 欧美日韩国产一区二区| 中文字幕a在线观看| 亚洲作爱视频| 欧美高清性xxxxhd| 天天免费亚洲黑人免费| 国产亚洲视频中文字幕视频| 四虎影院在线免费播放| 欧美经典三级视频一区二区三区| 三级a在线观看| 不卡av一区二区| 国产精品香蕉av| www.国产高清| 一区一区三区| 97久久精品人人做人人爽| 精品国产av无码一区二区三区| 亚洲日本va| 国色天香2019中文字幕在线观看| 人人妻人人澡人人爽人人欧美一区| 亚洲成av人片在线观看无码| 国产+高潮+白浆+无码| 国产亚洲一区在线| 欧美日韩精品免费看| 黄av在线播放| 99久久99久久综合| 国产精品沙发午睡系列| 久久99久久人婷婷精品综合| 日韩精品在线观看一区二区| 久久久久无码国产精品| 92国产精品观看| 人人干人人视频| 国产精品传媒精东影业在线| 成人在线观看av| 青青草视频在线免费直播| 亚洲第一av在线| 欧美brazzers| 亚洲丝袜另类动漫二区| 亚洲天堂美女视频| 美美哒免费高清在线观看视频一区二区| 91麻豆精品视频| 欧美日韩一区二区三区在线观看免 | 女仆av观看一区| 国产精品91一区| 一级片在线观看视频| 亚洲图片欧美色图| 国精产品视频一二二区| 粉嫩蜜臀av国产精品网站| 少妇高潮毛片色欲ava片| 日韩国产一区| 久久久久久久一区二区| 午夜影院在线视频| 欧美视频在线一区| 人妻久久一区二区| www.成人在线| 欧美一级小视频| 久久精品高清| 高清免费日韩| 91女主播在线观看| 日韩一区二区电影| 中国一级特黄毛片| 一区二区高清在线| 制服丨自拍丨欧美丨动漫丨| 99久久国产综合色|国产精品| 91在线国产观看| 亚洲看片网站| 日韩精品导航| 91成人伦理在线电影| 色老头在线一区二区三区| 久久久999精品| www.欧美国产| 精品美女国产在线| 免费毛片在线播放免费| 欧美国产精品一区| 国产探花在线观看视频| 日韩高清国产一区在线| 国产精品99久久久久久大便| 精品国产91乱码一区二区三区四区| 国产另类自拍| 综合激情五月婷婷| 亚洲一区二区三区乱码aⅴ| 免费在线成人激情电影| 久久精品99久久香蕉国产色戒| 国产污视频在线| 亚洲精品一区二区在线观看| 国产露脸91国语对白| 欧美人妇做爰xxxⅹ性高电影| 国产精品免费无遮挡无码永久视频| 亚洲午夜成aⅴ人片| 国产精品区在线| 国产日韩欧美一区在线| 成人毛片一区二区| 中日韩男男gay无套| 九一国产精品视频| 日韩视频精品在线观看| 国产精品久久..4399| 在线视频观看日韩| 亚洲人成无码网站久久99热国产| 亚洲午夜黄色| 免费一级特黄毛片| 99精品视频免费观看视频| 国自产拍偷拍精品啪啪一区二区 | 国产米奇在线777精品观看| 国产女同无遮挡互慰高潮91| 久久福利资源站| 911av视频| 国产精品456| 91精品人妻一区二区三区蜜桃2| 国产成人综合自拍| 中文字幕第3页| 97se亚洲国产综合自在线不卡| 日本黄色片在线播放| 久久精品夜色噜噜亚洲aⅴ| 国产综合精品久久久久成人av| 国产精品青草综合久久久久99| 殴美一级黄色片| 亚洲欧美经典视频| 国产一级一片免费播放放a| 黄色成人在线免费| 亚洲无码精品一区二区三区| 欧美视频在线一区| 国产成人a人亚洲精品无码| 精品久久久久久最新网址| 日韩一区二区三区中文字幕| 亚洲人高潮女人毛茸茸| 在线播放日本| 久久99久久99精品中文字幕| aa视频在线观看| 国产成人av网| 成人噜噜噜噜| 狠狠久久综合婷婷不卡| 欧美人与拘性视交免费看| 一区二区在线观| 狠狠干成人综合网| 国产三区在线视频| 韩国女主播成人在线观看| 白嫩情侣偷拍呻吟刺激| 国产三级欧美三级| 中文字幕av久久爽av| 欧美日韩在线免费| 一本一道人人妻人人妻αv| 欧美成人aa大片| 久久这里精品| 久久福利视频网| 欧美一级大片| 4444kk亚洲人成电影在线| 亚洲国产最新| 亚洲天堂第一区| 久久久久国内| 香蕉网在线视频| 久久午夜老司机| 中国毛片直接看| 色婷婷综合激情| 精品人妻一区二区三区浪潮在线 | 日本成人在线免费视频| 国产一区在线观看视频| 国产免费看av| 亚洲一线二线三线视频| 中文字幕一二三四| 亚洲国产精品久久久久久| 最新国产在线观看| 91黄色8090| 日韩免费成人| 五月婷婷综合色| 国产婷婷精品| 91人妻一区二区三区| 欧美国产乱子伦 | 五十路在线视频| 欧美成人免费全部| 欧美在线一级| 清纯唯美一区二区三区| 亚洲韩日在线| 在线观看视频你懂得| 国产精品美女久久久久久2018| 五月婷婷亚洲综合| 亚洲电影天堂av| 亚洲夜夜综合| 91久久久久久久久久久| 波多野结衣在线观看一区二区| 无码精品国产一区二区三区免费| 成人av动漫在线| 久久久久成人片免费观看蜜芽| 777精品伊人久久久久大香线蕉| 丁香在线视频| 国产成人av在线播放| 羞羞答答一区二区| 欧美亚洲日本一区二区三区| 床上的激情91.| 久久激情免费视频| 日韩女优毛片在线| 国产一二区在线| 成人网在线视频| 五月开心六月丁香综合色啪| 国产高清自拍一区| 日韩av久操| 免费看污污网站| 国产视频一区不卡| 在线观看日本网站| 日韩一卡二卡三卡国产欧美| caoporn国产精品免费视频| 国产精品444| 欧美日韩国产免费观看视频| 日本888xxxx| 久久久精品国产**网站| 亚洲天堂开心观看| 91欧美日韩麻豆精品| 欧美一二三区在线| 国产福利视频在线| 色综合91久久精品中文字幕 | 亚洲自拍第三页| 自拍av一区二区三区| 99热这里是精品| 亚洲欧美第一页| rebdb初裸写真在线观看| 久久99精品久久久久久噜噜| 日韩激情精品| 成人深夜直播免费观看| 欧美69wwwcom| 免费观看污网站| 亚洲蜜桃精久久久久久久| 亚洲h视频在线观看| 国内精品久久久久影院优| 欧美性生活一级片| 一区二区三区免费播放| 成人欧美一区二区三区视频网页| 精品久久久久中文慕人妻| 午夜精品在线视频| 国产精品23p| 51精品国自产在线| 国产精品蜜臀| 蜜桃91精品入口| 免费成人性网站| 国产盗摄一区二区三区在线| 欧美一区二区三区人| 成年男女免费视频网站不卡| 欧美日韩视频在线一区二区观看视频| 蜜桃av一区二区| 久久久91视频| 亚洲成人av片| 福利一区视频| www.射射射| 中文字幕在线免费不卡|