用PHP匹配字符串的最快方法

有很多方法可以使用PHP在另一个字符串中查找一个字符串,但是哪种方法最快?我进行了与双引号或单引号相同的测试,并下载了带有PHP中可用的一些字符串匹配功能的网页。

我首先生成了一个很长的字符串,可用于字符串匹配功能。下面的for循环生成一个字符串,其中包含“迭代0和迭代1以及迭代2 ...”,直到“迭代4999和”为止。

$testString = '';

for ($i=0; $i < 5000; $i++) {

 $testString .= "iteration " . $i . " and ";

}

然后将其传递给许多字符串匹配函数。这包括包含在正则表达式库ereg()和preg_match()。使用strpos()和strstr()函数是因为它们是字符串匹配的另一种常见方式,以及它们的一些变体,用于区分大小写不敏感的字符串。

我创建了一个循环,该循环将遍历所有这些函数10,000次,并搜索字符串“ ation 1234”,该字符串与循环中创建的字符串相去甚远。

for($i=0;$i<10000;$i++){

 $start = microtime();

 $y = ereg("ation 1234",$testString);

 $end = microtime();

 $results['ereg'][] = (getmicrotime($end) - getmicrotime($start));

 

 $start = microtime();

 $y = eregi("ation 1234",$testString);

 $end = microtime();

 $results['eregi'][] = (getmicrotime($end) - getmicrotime($start));

 

 $start = microtime();

 $y = eregi("ation 1234",$testString);

 $end = microtime();

 $results['eregi'][] = (getmicrotime($end) - getmicrotime($start));

 

 $start = microtime();

 $y = preg_match("/ation 1234/",$testString);

 $end = microtime();

 $results['preg_match'][] = (getmicrotime($end) - getmicrotime($start));

 

 $start = microtime();

 $y = preg_match("/ation 1234/i",$testString);

 $end = microtime();

 $results['preg_match_i'][] = (getmicrotime($end) - getmicrotime($start));

 

 $start = microtime();

 $y = strstr($testString,"ation 1234");

 $end = microtime();

 $results['strstr'][] = (getmicrotime($end) - getmicrotime($start));

 

 $start = microtime();

 $y = stristr($testString,"ation 1234");

 $end = microtime();

 $results['stristr'][] = (getmicrotime($end) - getmicrotime($start));

 

 $start = microtime();

 $y = strpos($testString,"ation 1234");

 $end = microtime();

 $results['strpos'][] = (getmicrotime($end) - getmicrotime($start));

 

 $start = microtime();

 $y = stripos($testString,"ation 1234");

 $end = microtime();

 $results['stripos'][] = (getmicrotime($end) - getmicrotime($start));

 

 $start = microtime();

 $y = stripos($testString,"ation 1234");

 $end = microtime();

 $results['strrpos'][] = (getmicrotime($end) - getmicrotime($start));

 

 $start = microtime();

 $y = stripos($testString,"ation 1234");

 $end = microtime();

 $results['strripos'][] = (getmicrotime($end) - getmicrotime($start));

}

这是每个功能所花费的平均时间,按照花费的时间顺序。

0.0000303914 strpos

0.0000536556 strstr

0.0003520699 preg_match

0.0003982489 preg_match_i

0.0020656907 stristr

0.0021577688 stripos

0.0021580010 strripos

0.0021581690 strrpos

0.0025946639 ereg

0.0033165006 eregi

我再次尝试了同样的事情,但是这次我使用的字符串仅比功能匹配的字符串长2个字符(两端分别一个)。这是按顺序排列的平均时间。

0.0000051508 strpos

0.0000052461 strstr

0.0000060365 strripos

0.0000060450 strrpos

0.0000060767 stripos

0.0000061181 stristr

0.0000064785 preg_match_i

0.0000067542 preg_match

0.0000117409 ereg

0.0000172299 eregi

这是我期望的结果。正则表达式函数需要更长的时间,因为它们必须先加载必要的库才能匹配字符串。另外,使用正则表达式的开销要比正常情况稍大。有趣的是,对于长字符串来说,这些preg_match()函数的性能要比许多旨在查找字符串的函数要好。ereg()功能较慢这一事实不足为奇。实际上,该php.net站点上有一条说明:

preg_match()使用与Perl兼容的正则表达式语法,通常是的更快替代方法ereg()。

所有这些函数都非常快,但是如果您真的担心性能,那么应该使用该strpos()函数测试字符串。strripos()除非您有非常小的字符串,否则请尽量避免使用特殊功能,例如。如果字符串较短,那么除非您确实需要,否则最好不要使用正则表达式函数。

以上是 用PHP匹配字符串的最快方法 的全部内容, 来源链接: utcz.com/z/345882.html

回到顶部