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

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

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

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

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

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

$str = preg_replace(&#39;%<script>.+?</script>%i&#39;,&#39;&#39;,$str);//非贪婪

   

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

$str = &#39;<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>&#39;;

   

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

$str = &#39;<script<script>alert(document.cookie)</script>>alert(document.cookie)</script>&#39;;
$str = preg_replace(&#39;%<script>.+?</script>%i&#39;,&#39;&#39;,$str);//非贪婪
print_r($str);
//$str 输出为 <script>alert(document.cookie)</script>

   

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

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