之前已經分析過strtr的源碼了現在就比較strtr str_replace和preg_replace的效率
復制代碼 代碼如下:
$str =
;
$str = str_repeat($str
);
$pattern
= array(
=>
=>
);
$pattern
= array(
a
=>
=>
);
$pattern
=
/
|
/
;
$pattern
=
/a|
/
;
$pattern
= array(
);
$pattern
= array(
a
);
$t = microtime(true);
for($i=
; $i<
; $i++)
{
strtr($str
$pattern
);
}
echo microtime(true)
$t
"/n"; //
$t = microtime(true);
for($i=
; $i<
; $i++)
{
strtr($str
$pattern
);
}
echo microtime(true)
$t
"/n"; //
$t = microtime(true);
for($i=
; $i<
; $i++)
{
preg_replace($pattern
$str);
}
echo microtime(true)
$t
"/n"; //
$t = microtime(true);
for($i=
; $i<
; $i++)
{
preg_replace($pattern
$str);
}
echo microtime(true)
$t
"/n"; //
$t = microtime(true);
for($i=
; $i<
; $i++)
{
str_replace($pattern
$str);
}
echo microtime(true)
$t
"/n"; //
$t = microtime(true);
for($i=
; $i<
; $i++)
{
str_replace($pattern
$str);
}
echo microtime(true)
$t
"/n"; //
//說明
當str_repeat的第二個參數為
時輸出第一個數字
當為
時輸出第二個數字
從輸出結果來看str_replace的整體表現相對strtr和preg_replace要好的原因從查看str_replace的源碼() 就可以看出str_replace(array search string|array replace string subject)在執行的時候會對search的每一個元素按照先後順序進行循環(不是按照下標或者其他的什麼順序這個和數組在底層的實現有關)然後 到subject中去匹配如果找到就替換為相應的replace這樣從效率上的確會比strtr好因為還會多一個從下標的最大長度到最小長度的循 環如果這時下標字符串的長度變化比較大的話且subject字符串比較長的話這裡的開銷也是比較大的不過str_replace這樣的實現也有個 我們需要注意的地方就是它不會像strtr那樣最大匹配優先例如
復制代碼 代碼如下:
str_replace(array(
ab
abc
)
abcd
);
如果使用的是strtr我們輸出的結果會是“d”因為strtr會實現最大匹配但是str_replace卻會輸出“cd”因為在search字符串中‘ab排在“abc”的前面所以會先把‘ab替換成了‘
現在小結一下這三個函數的用法
str_replace這個應該作為字符串替換的首選方法不過有一點需要注意就是把最希望匹配的元素放在前面(為了效率的提升有時這樣做也是值得的)
strtr strtr在短字符串替換的時候也是挺高效的不過search數組的下標長度的差別也對效率產生比較大的影響還有就是沒事最好不要使用strtr(string string string)這種形式(對於非單字節字符很容易產生亂碼)
preg_replace這個不用說可以使用正則匹配功能絕對是最強的不過也是要犧牲一點效率的
From:http://tw.wingwit.com/Article/program/PHP/201311/21252.html