亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

深度分析正則(pcre)最大回溯/遞歸限制

2020-03-16 21:12:01
字體:
來源:轉載
供稿:網友
深度分析正則(pcre)最大回溯/遞歸限制,需要的朋友可以參考下。
 
 
今天,Tank問了一個問題, 對于如下的正則: 
復制代碼代碼如下:

/<script>.*?<//script>/i 

當要匹配的字符串長度大于100014的時候, 就不會得出正確結果: 
復制代碼代碼如下:

$reg = "/<script>.*?<//script>/is"; 
$str = "<script>********</script>"; //長度大于100014 
$ret = preg_replace($reg, "", $str); //返回NULL 

難道正則對匹配的串有長度限制? 
不是, 當然不是, 原因是這樣的, 在PHP的pcre擴展中, 提供了倆個設置項. 
復制代碼代碼如下:

pcre.backtrack_limit //最大回溯數 
pcre.recursion_limit //最大嵌套數 

默認的backtarck_limit是100000(10萬). 
這個問題, 就和設置項backtrack_limit有關系. 現在要弄清這個問題的原因, 關鍵就是什么是”回溯”. 
這個正則, 使用非貪婪模式, 非貪婪模式匹配原理簡單來說是, 在可配也可不配的情況下, 優先不匹配. 記錄備選狀態, 并將匹配控制交給正則表達式的下一個匹配字符, 當之后的匹配失敗的時候, 再溯, 進行匹配. 
舉個例子: 
復制代碼代碼如下:

源字符串: aaab 
正則: .*? 

匹配過程開始的時候, “.*?”首先取得匹配控制權, 因為是非貪婪模式, 所以優先不匹配, 將匹配控制交給下一個匹配字符”b”, “b”在源字符串位置1匹配失敗(“a”), 于是回溯, 將匹配控制交回給”.*?”, 這個時候, “.*?”匹配一個字符”a”, 并再次將控制權交給”b”, 如此反復, 最終得到匹配結果, 這個過程中一共發生了3次回溯. 
現在我們來看看文章開頭的例子, 默認的backtrack_limit是100000, 而源字符串的開頭是9個字符, 一共是99997個字符. 
另外, 因為match函數自身的邏輯, 在文章開頭的例子下, 會導致回溯計數增3(有興趣的可以參看pcrelib/pcre_exec.c中match函數邏輯部分), 所以在匹配到"“之前, pcre中的回溯計數剛好是100000,于是就正常匹配, 退出. 
而, 只要在增加一個字符, 就會導致回溯計數大于100000, 從而導致匹配失敗退出. 
在PHP 5.2以后, 提供了: 
復制代碼代碼如下:

int preg_last_error ( void ) 
Returns the error code of the last PCRE regex execution. 

我們應該經常檢查這個函數的返回值, 當不為零的時候說明上一個正則函數出錯, 特別的對于文章的例子, 出錯返回(PREG_BACKTRACK_LIMIT_ERROR) 
最后, 在順便說一句, 非貪婪模式導致太多回溯, 必然會有一些性能問題, 適當的該寫下正則, 是可以避免這個問題的. 比如將文章開頭例子中的正則修改為: 
復制代碼代碼如下:

/<script>[^<]*<//script>/i 

就不會導致這么多的回溯了~ 
而recursion_limit限制了最大的正則嵌套層數, 如果這個值, 設置的太大, 可能會造成耗盡??臻g爆棧. 默認的100000似乎有點太大了… 
就比如對于一個長度為10000的字符串, 如下這個看似”簡”的單正則: 
復制代碼代碼如下:

//默認recursion_limit為100000 
$reg = /(.+?)+/is; 
$str = str_pad("laruence", 10000, "a"); //長度為1萬 
$ret = preg_repalce($reg, "", $str); 

會導致core, 這是因為嵌套太多, 導致爆棧. 
當然, 你可以通過修改棧的大小來暫時的解決這個問題, 比如修改??臻g為20M以后, 上面的代碼就能正常運行, 但這肯定不是最完美的解法. 根本之道, 還是優化正則. 
最后: 正則雖易, 用好卻難.. 尤其在做大數據量的文本處理的時候, 如果正則設計不慎, 很容易導致深度嵌套, 另外考慮到性能, 還是建議能用字符串處理盡量使用字符串處理代替.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色天天综合狠狠色| 欧美午夜激情小视频| 日本精品一区二区三区在线| 亚洲成人激情视频| 大伊人狠狠躁夜夜躁av一区| 久久久久国产一区二区三区| 欧美日韩精品二区| 精品国产鲁一鲁一区二区张丽| 另类图片亚洲另类| 亚洲精品白浆高清久久久久久| 热久久这里只有精品| 国产成人精品午夜| 国产精品日韩欧美| 亚洲成人网在线观看| 日韩成人在线播放| 亚洲人成人99网站| 亚洲精品久久久久久久久久久久久| 57pao精品| 亚洲区免费影片| 伊人激情综合网| 黑人巨大精品欧美一区免费视频| 91tv亚洲精品香蕉国产一区7ujn| 国产精品18久久久久久首页狼| 亚洲第一在线视频| 国产精品9999| 国外成人在线直播| 国产欧美日韩高清| 欧美在线视频观看免费网站| 久久人人爽亚洲精品天堂| 精品国产电影一区| 欧美性猛交xxxx免费看| 欧美午夜精品久久久久久人妖| 国内精品伊人久久| 亚洲亚裔videos黑人hd| 亚洲精品456在线播放狼人| 国产精品视频网址| 91亚洲va在线va天堂va国| 欧美激情图片区| 韩国精品久久久999| 日韩中文字幕免费看| 中文字幕精品—区二区| 国产精品久久久久久久9999| 欧美成人亚洲成人日韩成人| 精品伊人久久97| 亚洲精品二三区| 日韩精品免费综合视频在线播放| 91精品国产高清久久久久久久久| 亚洲精品网址在线观看| 欧美日韩一二三四五区| 亚洲国产精品久久久久秋霞蜜臀| 亚洲春色另类小说| 欧美剧在线观看| 欧美午夜影院在线视频| 亚洲另类欧美自拍| 欧美日韩裸体免费视频| 欧美精品制服第一页| 清纯唯美日韩制服另类| 国产中文日韩欧美| 欧美久久精品一级黑人c片| 亚洲男人天堂2024| 欧美黑人狂野猛交老妇| 91精品国产高清自在线| 播播国产欧美激情| 国产精品综合网站| 欧美夜福利tv在线| 97在线看免费观看视频在线观看| 亚洲色图50p| 深夜福利91大全| 久久久久九九九九| 国产91精品网站| 麻豆乱码国产一区二区三区| 久久福利视频导航| 在线观看中文字幕亚洲| 疯狂做受xxxx欧美肥白少妇| 欧美激情第一页xxx| 国产丝袜一区二区| 国产精品自产拍在线观看中文| 日韩视频免费在线观看| 国产精品入口尤物| 欧美午夜视频在线观看| 国产在线视频不卡| 国产精品99久久久久久人| 美女性感视频久久久| 国产精品稀缺呦系列在线| 成人激情在线播放| 色偷偷偷综合中文字幕;dd| 亚洲精品在线视频| 久久精品青青大伊人av| 精品爽片免费看久久| 久久精品国产综合| 国产精品69精品一区二区三区| 538国产精品一区二区在线| 理论片在线不卡免费观看| 精品一区电影国产| 中文字幕日韩高清| 91精品在线看| 国产精品久久激情| 国产精品久久久久9999| 久久精品国产电影| 久久成人综合视频| 国产高清视频一区三区| 成人a视频在线观看| 亚洲第五色综合网| 欧美激情精品久久久久久免费印度| 青青a在线精品免费观看| 欧美性猛交xxxx乱大交蜜桃| 91久久精品美女| 2019日本中文字幕| 国产日韩欧美在线视频观看| 影音先锋欧美在线资源| 久久久久久久久久久人体| 日韩精品欧美激情| 欧美亚洲另类在线| 日韩国产高清污视频在线观看| 国产亚洲成精品久久| 国产欧美精品久久久| 欧美激情第1页| 国产一区二区三区精品久久久| 国产一区二区丝袜高跟鞋图片| 国产精品久久久久久超碰| 精品女同一区二区三区在线播放| 亚洲精品一区二区网址| 欧洲亚洲免费视频| 国产日韩欧美综合| 国产日产欧美a一级在线| 精品自拍视频在线观看| 国产精品自产拍在线观看中文| 国产精品欧美一区二区| 成人xvideos免费视频| 国产精品视频午夜| 成人免费黄色网| 国产精品国产亚洲伊人久久| 国产不卡在线观看| 91久久嫩草影院一区二区| 国产91在线视频| 久久久999国产精品| 中文字幕久久精品| 国产成人精品日本亚洲| 日韩精品中文字幕在线播放| 97精品伊人久久久大香线蕉| 成人观看高清在线观看免费| 性欧美办公室18xxxxhd| 成人免费视频在线观看超级碰| 欧美成人精品三级在线观看| xxxx性欧美| 欧美成人网在线| 91精品久久久久久久久久久| 不卡毛片在线看| 亚洲第五色综合网| 亚洲精品久久久一区二区三区| 欧美性猛交99久久久久99按摩| 亚洲v日韩v综合v精品v| 2018中文字幕一区二区三区| 国产精品极品美女在线观看免费| 国模精品视频一区二区| 久久久伊人日本| 成人精品一区二区三区| 欧美日韩精品国产| 久久精品国产久精国产一老狼| 97在线免费视频| 亚洲国产日韩欧美在线图片| 91久久精品国产91性色| 91在线观看免费高清完整版在线观看| 亚洲石原莉奈一区二区在线观看|