婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > PHP正則表達式的效率 回溯與固化分組

PHP正則表達式的效率 回溯與固化分組

熱門標簽:上海銷售電銷機器人軟件 惠安地圖標注 山東外呼系統聯系方式 淄博市張店區地圖標注 浙江營銷外呼系統有哪些 地圖標注店鋪地圖標注酒店 遼寧秒客來電話機器人 自己做的電銷機器人 哈爾濱公司外呼系統代理
先來看下問題。

字符串
復制代碼 代碼如下:

$str = 'script>123456/script>';

正則表達式為
復制代碼 代碼如下:

$strRegex1 = '%script>.+\/script>%';
$strRegex2 = '%script>.+?\/script>%';
$strRegex3 = '%script>(?:(?!\/script>).)+\/script>%';

這三個正則,分別會造成幾次回溯呢??
答案:
復制代碼 代碼如下:

$strRegex1 = '%script>.+\/script>%'; //9次,記得區別轉義符號。
$strRegex2 = '%script>.+?\/script>%'; //5次
$strRegex3 = '%script>(?:(?!\/script>).)+\/script>%'; //7次

對于第一種貪婪匹配的匹配規則,回溯的9次是正則【】對字符串“”匹配時,構成的回溯,回溯的次數,恰好是字符串的長度。
第二種非貪婪匹配規則,回溯5次,是正則【.+?】對字符串“123456”匹配時構成的回溯。回溯的次數,為字符串長度減去最小次數。也就是6-1=5次。如果正則表達式為【.*?】那么,回溯次數就是6次了。
第三種正則是零寬斷言,或者叫環視。(暫且不說。)
在NFA正則引擎中,回溯是他的靈魂,所以,不管是貪婪,非貪婪,環視等寫法中肯定會有回溯的出現的,這個我們無法避免(用詞不太準確),但是,我們可以減少回溯的次數,或者保護其中一部分匹配的規則不進行回溯。

對于上篇BLOG上提到的鳥哥談到一個非貪婪引起的大量回溯問題,大家可以知道,回溯,確實是浪費資源的罪魁禍首,那么,我們能否不讓其回溯呢?
答案是肯定的,NFA引擎中,有個概念,叫固化分組。引用一下書上的概念
復制代碼 代碼如下:

具體來說,使用「(?>…)」的匹配與正常的匹配并無差別,但是如果匹配進行到此結構之后(也就是,進行到閉括號之后),那么此結構體中的所有備用狀態都會被放棄。也就是說,在固化分組匹配結束時,它已經匹配的文本已經固化為一個單元,只能作為整體而保留或放棄。括號內的子表達式中未嘗試過的備用狀態都不復存在了,所以回溯永遠也不能選擇其中的狀態(至少是,當此結構匹配完成時,“鎖定(locked in)”在其中的狀態)。

那么,固化分組到底有什么用處呢?我們來舉個例子。(找不到合適的例子,俺只好借用一下書上的例子了)
比如要處理一批數據,原來格式為123.456,后來因為浮點數顯示問題,部分數據格式變為123.456000000789這種,,要求做到只保留小數點后面2-3位,但是,最后一位不能為0,這個正則如何寫呢?(下面直接考慮小數點后面的數字),寫出正則之后,我們還要用這個正則去匹配數據,把原來的數據替換成匹配的結果。
首先,我們可以立刻寫出這樣的正則【\.\d\d[1-9]?\d*】,PHP代碼為
復制代碼 代碼如下:

$str = preg_replace('\.(\d\d[1-9]?)\d*','\\1',$str); //匹配結果的group1進行反向引用

很明顯,這種寫法,對于部分數據格式為123.456的這種格式,白白的處理了一遍,為了提高效率,我們還要對這個正則進行處理。從123.456這個字符串跟其他的比較一下,我們發現,是疑問123.456這個數據后面沒數字了,所以,白白處理一遍。那好辦,我們對這個正則改造一下,把后面的量詞*改成+,這樣對于123.45 小數點后面1,2位數字的,不會去白白處理,而且,對三位以上數字的,處理正常。其PHP代碼為
復制代碼 代碼如下:

$str = preg_replace('\.(\d\d[1-9]?)\d+','\\1',$str);

好了,這個正則真的沒問題嗎??確定嗎?上篇博文,我們了解了匹配原理,那么,我們也分析一下這個正則的匹配過程吧。
字符串"123.456",正則表達式為【\.(\d\d[1-9]?)\d+】,我們來看下
首先(小數點前123不說了),【\.】匹配".",匹配成功,把控制權給下一個【\d】,【\d】匹配“4”成功,把控制權給第二個【\d】,這個【\d】匹配“5”成功,然后,把控制權給了【[1-9]?】,由于量詞是【?】,正則表達式遵循“量詞優先匹配”,而且,此處是【?】,還會留下一個回溯點。然后匹配"6"成功,然后把控制權給【\d+】,【\d+】發現后面沒字符了,最遵循“后進先出”規則,回到上一個回溯點,進行匹配,這時,【[1-9]?】會交還出其匹配的字符“6”,【[1-9]?】匹配“6”成功。匹配完成了。大家發現【(\d\d[1-9]?)】匹配的結果確是"45",并不是我們想要的“456”,“6”被【\d+】匹配去了。那么,我們該如何辦呢? 能否讓【[1-9]?】匹配一旦成功,不進行回溯呢?這就用到了我們上面說的"固化分組", PHP(preg_replace函數)中使用的正則引擎支持固化分組,我們根據固化分組的寫法,可以把代碼改成如下方式
復制代碼 代碼如下:

$str = preg_replace('\.(\d\d(?>[1-9]?))\d+','\\1',$str);

改成這樣的話,那字符串“123.456“是不符合要求,不會被匹配的。那我們就可以實現我們的要求了。

從上面的例子中,知道了固化分組的作用,那么對于鳥哥BLOG上寫的那個非貪婪的回溯問題,我們能否也對其改造,使得其不回溯呢?
先看下鳥哥給的答案
復制代碼 代碼如下:

/script>[^]*\/script>/is

鳥哥寫的很精悍。排除“”之外的所有字符都符合,而且,中間部分不回溯,效率高。可是,如果中間有字符““的話(如下代碼)
復制代碼 代碼如下:

script>
if a b
/script>

那鳥哥的這個正則就不能匹配,就不能實現我們想要的功能了。
那我們可以根據 固化分組、環視(零寬斷言)來實現這個要求,最后,CFC4N給出的正則以及PHP代碼事例如下
復制代碼 代碼如下:

$reg = '%script>(?>[^]*)(?>(?!/?script>)[^]*)*/script>%is';
$str = str_pad("script>", 111111, "*"); //字符長度大于PHP回溯限制的100000
$str .= 'if a b ; if b > c;/script>'; //隨便加幾個包含 > 的測試字符
$ret = preg_replace($reg, "OK", $str);
print_r($ret); //打印結果 OK,證明匹配正確
var_dump(preg_last_error()); //上一次匹配錯誤。其輸出為 int(0)

嗨,同學,你看明白了嗎?

以上為小菜CFC4N的愚文,如有錯誤,歡迎指出。
您可能感興趣的文章:
  • 最常用的PHP正則表達式收集整理
  • PHP 正則表達式常用函數使用小結
  • PHP匹配連續的數字或字母的正則表達式
  • php中字符串和正則表達式詳解
  • php過濾HTML標簽、屬性等正則表達式匯總
  • php使用正則表達式提取字符串中尖括號、小括號、中括號、大括號中的字符串
  • PHP之正則表達式捕獲組與非捕獲組(詳解)
  • PHP正則表達式之捕獲組與非捕獲組
  • 淺談PHP正則中的捕獲組與非捕獲組
  • PHP實現正則表達式分組捕獲操作示例

標簽:綿陽 泰州 重慶 銅川 西安 無錫 宣城 長沙

巨人網絡通訊聲明:本文標題《PHP正則表達式的效率 回溯與固化分組》,本文關鍵詞  PHP,正則,表達式,的,效率,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《PHP正則表達式的效率 回溯與固化分組》相關的同類信息!
  • 本頁收集關于PHP正則表達式的效率 回溯與固化分組的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    久久精品日韩一区二区三区| 欧美日韩国产一级片| 色婷婷精品大视频在线蜜桃视频| 日韩三级视频在线看| 国产欧美日韩卡一| 色乱码一区二区三区88| 久久一二三国产| 亚洲精品一二三四区| 美女视频网站久久| 国产精品91一区二区| 亚洲电影欧美电影有声小说| 奇米影视一区二区三区小说| 色婷婷狠狠综合| 亚洲女同一区二区| 69久久99精品久久久久婷婷| 日本电影欧美片| 久久久影视传媒| 91网站最新网址| 91精品国产综合久久久蜜臀粉嫩| 久久夜色精品一区| 国产一二精品视频| 欧美激情综合五月色丁香小说| 亚洲精品国产a| 国内精品视频一区二区三区八戒| 午夜影院在线观看欧美| 制服丝袜国产精品| 日本三级亚洲精品| 欧美精品一二三| 久久精品国产一区二区三区免费看| 亚洲精品一区二区三区四区高清| 懂色中文一区二区在线播放| 亚洲久草在线视频| 欧美三级电影网| 免费高清视频精品| 在线观看91视频| 免费在线观看日韩欧美| 一区二区在线免费| 有码一区二区三区| 精品99一区二区| 中文字幕一区二区三区乱码在线| 亚洲欧洲成人精品av97| 偷拍一区二区三区四区| 精品亚洲免费视频| 久久国产精品色| 三级久久三级久久久| 国产东北露脸精品视频| 亚洲一区在线视频| 麻豆精品精品国产自在97香蕉| 久久99热这里只有精品| 国产精品一区免费视频| 99re热视频精品| 欧美日韩免费一区二区三区| 日韩精品在线网站| 久久久久久久久久美女| 日韩免费看的电影| 精品国内二区三区| 欧美福利一区二区| 久久久久99精品国产片| 国产精品18久久久久久久久久久久 | 精品视频在线看| 亚洲女与黑人做爰| 亚洲激情图片一区| 国产精品久久久久影院| 337p亚洲精品色噜噜| 91色乱码一区二区三区| 日韩美女视频19| 欧美日韩久久一区二区| 成人国产一区二区三区精品| 欧美精品在线观看播放| 欧美剧情片在线观看| 国产欧美日韩不卡免费| 亚洲综合一二三区| 亚洲精品国产第一综合99久久| 亚洲欧美另类综合偷拍| 一区二区三区不卡视频在线观看| 亚洲国产高清在线观看视频| 日韩专区在线视频| 欧美大片在线观看一区| 欧美色国产精品| 欧美一区二区三区不卡| 日韩电影在线看| 北条麻妃一区二区三区| 色婷婷综合久久久| 日韩欧美一区二区视频| 国产精品毛片a∨一区二区三区| 亚洲欧美国产毛片在线| 免费人成精品欧美精品| 91片黄在线观看| 欧美成人video| 一区二区三区在线观看网站| 国产白丝精品91爽爽久久| 国产在线麻豆精品观看| 在线视频中文字幕一区二区| 日本一区二区三区四区| 日韩电影免费在线观看网站| 性欧美大战久久久久久久久| 91在线观看地址| 欧美激情艳妇裸体舞| 蜜桃免费网站一区二区三区| 波波电影院一区二区三区| 精品国产一区二区亚洲人成毛片| 中文字幕一区二区三区不卡| 伦理电影国产精品| 国产一区二区视频在线播放| 9191成人精品久久| 日本不卡视频在线观看| 国产激情一区二区三区四区| 精品国产1区2区3区| 亚洲日本乱码在线观看| 精品一二线国产| 欧美性大战久久久久久久蜜臀 | 久久一日本道色综合| 亚洲高清一区二区三区| 欧美日韩精品一区二区天天拍小说 | 成年人午夜久久久| 欧美一区二区成人| 亚洲老妇xxxxxx| 国产一区二区调教| 欧美剧情片在线观看| 久久99精品一区二区三区| 欧美欧美欧美欧美| 亚洲综合视频网| 免费成人性网站| 国产精品久久久久久久久快鸭 | 欧美一区二区福利视频| 亚洲午夜羞羞片| 成人毛片在线观看| 午夜视频一区二区| 久久夜色精品国产欧美乱极品| 91福利精品第一导航| 亚洲夂夂婷婷色拍ww47| 日韩视频一区二区在线观看| 国产激情精品久久久第一区二区| 国产亚洲欧美日韩日本| 国产中文字幕精品| 午夜亚洲国产au精品一区二区| 欧美一级片在线观看| 麻豆精品精品国产自在97香蕉 | 精品国产乱码久久久久久老虎 | 日韩一区二区三区在线| 久久激情五月婷婷| 一区二区视频在线看| 欧美情侣在线播放| 丁香五精品蜜臀久久久久99网站| 天天综合网天天综合色| 久久久久久久久久久久久夜| 国产91高潮流白浆在线麻豆 | 亚洲少妇最新在线视频| 国产日本欧美一区二区| 在线综合亚洲欧美在线视频| 精品在线你懂的| 美国毛片一区二区| 香蕉成人啪国产精品视频综合网 | 北条麻妃国产九九精品视频| 麻豆成人综合网| 亚洲摸摸操操av| 亚洲精品一区二区三区精华液 | 粉嫩高潮美女一区二区三区| 国产在线精品视频| 久久99精品久久久久婷婷| 蜜桃av一区二区三区电影| 免费av成人在线| 麻豆91精品视频| 午夜精品国产更新| 日韩成人精品在线观看| 日韩精品国产精品| 日韩电影免费在线| 麻豆91精品视频| 国产成人在线电影| 日韩精品免费视频人成| 国模一区二区三区白浆| 久久狠狠亚洲综合| 国产精品一卡二卡| 国产揄拍国内精品对白| 精品一区二区在线看| 久久精品99国产精品日本| 亚洲一区在线视频观看| 丝袜国产日韩另类美女| 美洲天堂一区二卡三卡四卡视频| 免费看日韩精品| 国产91对白在线观看九色| 91网址在线看| 精品动漫一区二区三区在线观看| 欧美精品电影在线播放| 国产亚洲欧洲997久久综合| 日韩欧美一二三区| 欧美www视频| 日本一区二区综合亚洲| 国产精品久久久久一区二区三区共 | 欧美一区中文字幕| 在线成人午夜影院| 欧美大片在线观看一区二区| 久久夜色精品一区| 亚洲自拍偷拍网站| 五月婷婷综合在线| 亚洲综合久久久久| 欧美色窝79yyyycom| 日韩欧美成人激情| 日韩欧美在线网站| 一区免费观看视频|