Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在php中,哪个是快速进程strpos()/stripos()或preg_match()_Php_Preg Match_Strpos_Stripos - Fatal编程技术网

在php中,哪个是快速进程strpos()/stripos()或preg_match()

在php中,哪个是快速进程strpos()/stripos()或preg_match(),php,preg-match,strpos,stripos,Php,Preg Match,Strpos,Stripos,我只想知道php中哪一个函数的strpos()/stripos()或preg_match()速度快。基准测试是一项棘手的工作,但可以肯定地说,preg_match比strpos或stripos慢。这是因为PRCE函数实现了一个比字符串函数更强大、更灵活的正则表达式引擎 他们也做不同的事情strpos将告诉您另一个字符串中字符串开头的索引,而preg_match主要用于探测字符串的格式,并基于正则表达式检索字符串的部分 简而言之,如果您只是想在另一个字符串中找到一个字符串,请使用strpos或st

我只想知道php中哪一个函数的strpos()/stripos()或preg_match()速度快。

基准测试是一项棘手的工作,但可以肯定地说,
preg_match
strpos
stripos
慢。这是因为PRCE函数实现了一个比字符串函数更强大、更灵活的正则表达式引擎

他们也做不同的事情
strpos
将告诉您另一个字符串中字符串开头的索引,而
preg_match
主要用于探测字符串的格式,并基于正则表达式检索字符串的部分


简而言之,如果您只是想在另一个字符串中找到一个字符串,请使用
strpos
stripos

preg\u match
是三个字符串中最慢的一个
stripos
将比strpos慢,因为它必须做额外的工作来处理不区分大小写的匹配。

我发现它已经针对您的问题运行了一些测试,结果是:

  • strpos()比preg_match()快3-16倍
  • stripos()比Stropos()慢2-30倍
  • stripos()比使用 无壳修饰语“//i”
  • 在preg_match()中使用正则表达式并不比使用 长线
  • 在preg_match()中使用utf8修饰符“//u”会使其速度降低2倍
使用的代码是:

<?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);
$str_500k = str_repeat('a', 1024*500).str_repeat('b', 1024);
$str_1m = str_repeat('a', 1024*1024).str_repeat('b', 1024);

$b = 'b';
$b_10 = str_repeat('b', 10);
$b_100 = str_repeat('b', 100);
$b_1k = str_repeat('b', 1024);

echo str_replace(',', "\t", ',strpos,preg,preg U,preg S,preg regex,stripos,preg u,'.
  'preg i,preg u i,preg i regex,stripos uc,preg i uc,preg i uc regex').PHP_EOL;

foreach (array($b, $b_10, $b_100, $b_1k) as $needle) {
  foreach (array($str_50, $str_100, $str_500, $str_1k, $str_10k,
    $str_100k, $str_500k, $str_1m) as $str) {

    echo strlen($needle).'/'.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);

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

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

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

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

    $regex = '!'.$needle.'!u';
    $start = mt();
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg utf-8
    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);

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

    $regex = "!b{".strlen($needle)."}!i";
    $start = mt();
    for ($i=0; $i<25000; $i++) $j = preg_match($regex, $str); // preg i regex
    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();