在PHP中检查字符串中特定字符数量的最快方法是什么?

时间:2017-01-12 17:55:34

标签: php string charsequence

所以我需要检查字符串中特定集合的字符数量是否高于某个数字,这是最快的方法吗?

例如我有一个很长的字符串“一些文字和一些文字和一些文字+更多+更多......等等。”我需要检查是否有r超过3个下一个符号:[& + ]。因此,当我遇到其中一个字符的第四次出现时,我只需要返回false,并停止循环。所以我想创建一个这样的简单函数。但我不知道在PHP中有任何本机方法可以做这样的事情吗?但我需要一些功能,不会浪费时间解析字符串直到最后,因为字符串可能很长。所以我认为regexp和 count_chars r等功能不适合那种工作......

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

我不了解原生方法,我认为count_chars可能与您将要获得的一样接近。但是,滚动自定义解决方案会相对简单:

$str = 'your text here';
$chars = ['&', '.', '+'];
$count = [];
$length = strlen($str);
$limit = 3;
for ($i = 0; $i < $length; $i++) {
    if (in_array($str[$i], $chars)) {
        $count[$str[$i]] += 1;
        if ($count[$str[$i]] > $limit) {
            break;
        }
    }
}

数据实际来自哪里也可能有所不同。例如,如果它来自某个文件,那么您可以利用fread的第二个参数,在while循环内一次只读取x个字节数。 / p>

找到最快的方式可能是一个太宽泛的问题,因为PHP有​​很多字符串相关的功能;其他解决方案可能会使用strstrstrpos等...

答案 1 :(得分:0)

没有对其他解决方案进行基准测试,但http://php.net/manual/en/function.str-replace.php传递一系列选项会很快。有一个可选参数,它返回替换次数。检查该号码

cmp commons/org/slf4j/Logger.class slf4j-1.7.22/slf4j-api-1.7.22/org/slf4j/Logger.class

答案 2 :(得分:-1)

好吧,我所有的想法都错了,我的期望被真正的考验压垮了。与使用简单符号检查循环的自制函数相比,RegExp的工作速度提高了2到7倍(使用不同的字符串)。

代码:

// self-made function:
function chk_occurs($str,$chrs,$limit){
    $r=false;
    $count = 0;
    $length = strlen($str);
    for($i=0; $i<$length; $i++){
        if(in_array($str[$i], $chrs)){
            $count++;
            if($count>$limit){
                $r=true;
                break;
            }
        }
    }
    return $r;
}

// RegExp i've used for tests:
preg_match('/([&\\.\\+]|[&\\.\\+][^&\\.\\+]+?){3,}?/',$str);

当然它的工作速度更快,因为它只是对本机函数的一次调用,但即使包含在函数中的相同代码的工作速度也要快2到4.8倍。

//RegExp wrapped into the function:
function chk_occurs_preg($str,$chrs,$limit){
    $chrs=preg_quote($chrs);
    return preg_match('/(['.$chrs.']|['.$chrs.'][^'.$chrs.']+?){'.$limit.',}?/',$str);
}

P.S。我没有费心去检查cpu-time,只是通过200k迭代循环的 microtime(true); 来测试walltime,但这对我来说已经足够了。

相关问题