由于有人提到效率,我出于好奇对迄今为止给出的函数进行了基准测试:
function startsWith1($str, $char) {
return strpos($str, $char) === 0;
}
function startsWith2($str, $char) {
return stripos($str, $char) === 0;
}
function startsWith3($str, $char) {
return substr($str, 0, 1) === $char;
}
function startsWith4($str, $char){
return $str[0] === $char;
}
function startsWith5($str, $char){
return (bool) preg_match('/^' . $char . '/', $str);
}
function startsWith6($str, $char) {
if (is_null($encoding)) $encoding = mb_internal_encoding();
return mb_substr($str, 0, mb_strlen($char, $encoding), $encoding) === $char;
}
这是我平均每台运行 100.000 次的 DualCore 机器上的结果
// Testing '_string'
startsWith1 took 0.385906934738
startsWith2 took 0.457293987274
startsWith3 took 0.412894964218
startsWith4 took 0.366240024567 <-- fastest
startsWith5 took 0.642996072769
startsWith6 took 1.39859509468
// Tested "string"
startsWith1 took 0.384965896606
startsWith2 took 0.445554971695
startsWith3 took 0.42377281189
startsWith4 took 0.373164176941 <-- fastest
startsWith5 took 0.630424022675
startsWith6 took 1.40699005127
// Tested 1000 char random string [a-z0-9]
startsWith1 took 0.430691003799
startsWith2 took 4.447286129
startsWith3 took 0.413349866867
startsWith4 took 0.368592977524 <-- fastest
startsWith5 took 0.627470016479
startsWith6 took 1.40957403183
// Tested 1000 char random string [a-z0-9] with '_' prefix
startsWith1 took 0.384054899216
startsWith2 took 4.41522812843
startsWith3 took 0.408898115158
startsWith4 took 0.363884925842 <-- fastest
startsWith5 took 0.638479948044
startsWith6 took 1.41304707527
如您所见,将 haystack 视为数组以找出第一个位置的字符是总是最快的解决方案。无论字符串长度如何,它也始终以相同的速度执行。当字符串不以前缀开头时,使用strpos 比substr 短字符串快,但长字符串慢。差异是无关紧要的。 stripos 对于长字符串难以置信慢。 preg_match 无论字符串长度如何,性能几乎相同,但速度却很一般。 mb_substr 解决方案性能最差,但可能更可靠。
鉴于这些数字是针对 100.000 次运行的,很明显我们所说的是每次调用 0.0000x 秒。为效率选择一个而不是另一个是毫无价值的微优化,除非您的应用正在以 startsWith 为生。