什么是检查一个字符串是否包含三个或更多的破折号的最快方法?

时间:2013-08-29 00:08:14

标签: php regex string

正则表达式是唯一的方法吗?这很慢吗?

这样的东西?

preg_match("/^(\-){3,}/", $string);

4 个答案:

答案 0 :(得分:3)

仅破折号

如果您希望字符串破折号,且必须有3个或更多:

$match = (preg_match('/^-{3,}$/', $string) === 1);

没有正则表达式的另一种方式似乎慢了约25%(isset节拍strlen):

$match = (count_chars($string, 3) === '-' && isset($string[2]));

相邻的破折号

如果您想连续使用3个或更多短划线,但可能还有其他字符(例如foo---bar):

$match = (strpos($string, '---') !== false);

一些破折号

如果您想在任何地方使用3个或更多短划线(例如-foo-bar-):

$match = (substr_count($string, '-') >= 3);

答案 1 :(得分:0)

有substr_count函数。可能适合计算字符

echo substr_count('fa-r-r', '-'); // outputs 2

答案 2 :(得分:0)

你可以这样做:

function dashtest($str) {
   $rep = str_replace('-', '', $str);
   $length = strlen($str);
   return ( $length>2 && $rep =='' ) ? true : false;
}

另一种方式:

function dashtest($str) {
    for ($i=0 ; $i<strlen($str); $i++) {
        if ($str[$i]!='-') return false;
    }
    if ($i<3) return false;
    return true;
}

正则表达方式:

if (preg_match('~^-{3,}+$~', $str)) { /*true*/} else { /*false*/}

答案 3 :(得分:-1)

我跑了这个测试,有趣的是正则表达式是最快的

<?php


function dashtest($str) {
   $rep = str_replace( '-', '', $str );
   $length = strlen( $str );
   return ( $length < 3 || $rep != '' ) ? false : true;
}

function dashtest2($str) {
    for ($i=0 ; $i<strlen($str); $i++) {
        if ($str[$i]!='-') return false;
    }
    if ($i<3) return false;
    return true;
}



$string = '------------';



$start = microtime(true);

for ( $i=0; $i<100000; $i++ ) {
    dashtest( $string );
}

echo microtime(true) - $start;
echo "\n";



$start = microtime(true);

for ( $i=0; $i<100000; $i++ ) {
    dashtest2( $string );
}

echo microtime(true) - $start;
echo "\n";



$start = microtime(true);

for ( $i=0; $i<100000; $i++ ) {
    (preg_match('/^-{3,}$/', $string) === 1);
}

echo microtime(true) - $start;
echo "\n";

输出:

0.38635802268982

1.5208051204681&lt; - 哈哈!

0.15313696861267

另一次尝试

$string = '----------------------------------------------------------------------------';

0.52067899703979

8.7124900817871

0.17864608764648

regex再次获胜