示例:我有一个$variable = "_foo",我想确保$ variable不以下划线开头"_".我怎么能用PHP做到这一点?是否有一些访问字符串后面的char数组?
Pet*_*rfy 119
$variable[0] != "_"
Run Code Online (Sandbox Code Playgroud)
在PHP中,您可以使用数组索引表示法获取字符串的特定字符.$variable[0]是字符串的第一个字符(如果$ variable是一个字符串).
Ale*_*ton 106
您可以substr在php中查看该函数并以这种方式获取第一个字符:
http://php.net/manual/en/function.substr.php
if (substr('_abcdef', 0, 1) === '_') { ... }
Run Code Online (Sandbox Code Playgroud)
Gor*_*don 46
既然有人提到了效率,我已经基于好奇心对迄今给出的功能进行了基准测试:
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;
}
Run Code Online (Sandbox Code Playgroud)
以下是我的平均DualCore机器的结果,每台机器运行100.000次
// 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
Run Code Online (Sandbox Code Playgroud)
如您所见,将haystack视为数组以找出第一个位置的char 始终是最快的解决方案.无论字符串长度如何,它也始终以相同的速度执行.使用strpos比substr短字符串更快,但对于长字符串更慢,当字符串不以前缀开头时.但差异无关紧要.stripos是令人难以置信的长字符串慢.preg_match无论字符串长度如何,大致相同,但速度只是平庸.该mb_substr解决方案表现最差,但可能更可靠.
鉴于这些数字是100.000次运行,显然我们说的是每次通话0.0000x秒.除非你的应用程序正在检查生活,否则为了效率而挑选一个是另一个非常有价值的微优化startsWith.
这是您不关心性能的最简单的答案:
if (strpos($string, '_') === 0) {
# code
}
Run Code Online (Sandbox Code Playgroud)
如果strpos返回,0则表示您要查找的内容始于字符0,即字符串的开头.
这里有详细记录:http://uk3.php.net/manual/en/function.strpos.php
(PS $string[0] === '_'是最好的答案)
function starts_with($s, $prefix){
// returns a bool
return strpos($s, $prefix) === 0;
}
starts_with($variable, "_");
Run Code Online (Sandbox Code Playgroud)