首頁  >  文章  >  後端開發  >  PHP 正規表示式效率 貪婪、非貪婪與回溯分析(推薦)

PHP 正規表示式效率 貪婪、非貪婪與回溯分析(推薦)

高洛峰
高洛峰原創
2017-01-09 10:16:421706瀏覽

先掃盲一下什麼是正規表示式的貪婪,什麼是非貪婪?或說什麼是匹配優先量詞,什麼是忽略優先量詞?

好吧,我也不知道概念是什麼,來舉例。

某同學想過濾之間的內容,那是這麼寫正則以及程序的。

$str = preg_replace('%%i','',$str);//非贪婪

   

看起來,好像沒什麼問題,其實則不然。若

$str = 'alert(document.cookie)>alert(document.cookie)';

   

那麼經過上面的程序處理,其結果為

$str = 'alert(document.cookie)>alert(document.cookie)';
$str = preg_replace('%%i','',$str);//非贪婪
print_r($str);
//$str 输出为 

   

仍然達不到他想要的效果。上面的就是非貪婪,也有的叫惰性。其標誌非貪婪的標識為量數元字元後面加? ,例如 +?、*?、??(比較特殊,以後的BLOG中,我會寫到)等。即標識非貪婪,如果不寫?就是貪婪。例如

$str = 'alert(document.cookie)>alert(document.cookie)';
$str = preg_replace('%%i','',$str);//非贪婪
print_r($str);
//$str 输出为 "; //长度大于100014
$ret = preg_repalce($reg, "", $str); //返回NULL

   

其原因就是回溯太多了,直到造成耗盡棧空間爆棧。

再來看個例子。

字串

$str = '';

   

字符串

$strRegex1 = '%