正则表达式是唯一的方法吗?这很慢吗?
这样的东西?
preg_match("/^(\-){3,}/", $string);
答案 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再次获胜