preg_match()或stripos()?

时间:2012-03-05 05:29:08

标签: php

用于在字符串中进行不敏感的案例搜索,其功能是更快的preg_match()还是stripos()?

<?php 

$string = "This is test string";    
$result = preg_match('/test/i', $string);

OR

$result = stripos($string, 'test') !== false;  
?>

5 个答案:

答案 0 :(得分:4)

根据我的经验,stripos更快。

答案 1 :(得分:1)

如果您不需要实际匹配复杂表达式或捕获某些内容,那么只需使用striposstrpos

答案 2 :(得分:0)

strpos更快,因为这个函数有预定义规则这个函数必须做什么...在preg_match函数中我们必须从我们这边传递逻辑...所以在这种情况下首先要根据这个定义规则和工作

所以strops更快......

答案 3 :(得分:0)

为了获得真正的性能提升,我会避免“密集搜索”。

一些高级搜索技术,如使用mysql或sphinx进行索引全文搜索,对于“密集搜索”问题来说,是一个真正的解决方案。

虽然这些已经效率低下的函数的所有这些微不足道的比较涉及到完全扫描数据都无济于事。

如果你坚持使用它们 - 没有表现出你的担忧。因此 - 不要浪费任何人的时间进行比较。

答案 4 :(得分:0)

stripos速度慢,比使用strtolower <{1}}

更好
strpos

以秒为单位的结果

<?php

function loop()
{
  $str_50 = str_repeat('a', 50).str_repeat('b', 50);
  $str_100 = str_repeat('a', 100).str_repeat('b', 100);
  $str_500 = str_repeat('a', 250).str_repeat('b', 250);
  $str_1k = str_repeat('a', 1024).str_repeat('b', 1024);
  $str_10k = str_repeat('a', 10240).str_repeat('b', 1024);
  $str_100k = str_repeat('a', 102400).str_repeat('b', 1024);
  $needle = 'b';

  header("Content-Type: text/plain");

  echo str_replace(',', "\t", 'count,strpos,preg,stripos,preg i,strpos(tolower)').PHP_EOL;

  foreach(array($str_50, $str_100, $str_500, $str_1k, $str_10k, $str_100k) as $str)
  {
    echo strlen($str);
    $start = mt();
    for($i = 0; $i < 25000; $i++) $j = strpos($str, $needle); // strpos
    echo "\t".mt($start);

    $regex = '!'.$needle.'!';
    $start = mt();
    for($i = 0; $i < 25000; $i++) $j = preg_match($regex, $str); // preg
    echo "\t".mt($start);

    $start = mt();
    for($i = 0; $i < 25000; $i++) $j = stripos($str, $needle); // stripos
    echo "\t".mt($start);

    $regex = '!'.$needle.'!i';
    $start = mt();
    for($i = 0; $i < 25000; $i++) $j = preg_match($regex, $str); // preg i
    echo "\t".mt($start);

    $str = strtolower($str);
    $start = mt();
    for($i = 0; $i < 25000; $i++) $j = strpos($str, $needle); // strtolower strpos
    echo "\t".mt($start);

    echo PHP_EOL;
  }
  echo PHP_EOL;
}


function mt($start = null)
{
  if($start === null)
    return microtime(true);
  return number_format(microtime(true)-$start, 4);
}


loop();