如何检查一个string是否以PHP中的“_”开头?

例如:我有一个$variable = "_foo" ,我想确保$ variable不以下划线"_"开头。 我怎么能在PHP中做到这一点? 是否有一些访问string后面的char数组?

你可能会检查出php中的substr函数,并抓住第一个字符:

http://php.net/manual/en/function.substr.php

 if (substr('_abcdef', 0, 1) === '_') { ... } 
 $variable[0] != "_" 

它是如何工作的?

在PHP中,您可以通过数组索引表示法获得特定字符的string。 $variable[0]是string的第一个字符(如果$ variable是一个string)。

由于有人提到效率,所以我已经以好奇为基准给出了迄今给出的function:

 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 

正如你所看到的那样,把干草堆当作数组来找出第一个位置的字符总是最快的解决scheme。 无论弦长如何,它总是以相同的速度运行。 对于短string,使用strpossubstr速度快,但对于长string,string不以前缀开始时,速度会比较慢。 但是这个差别是无关紧要的。 stripos长弦非常慢。 preg_match执行大部分相同,不pipestring长度,但只是速度平庸。 mb_substr解决schemeperformance最差,尽pipe可能更可靠。

鉴于这些数字是100.000次运行,应该很明显,我们正在谈论每个电话0.0000x秒。 为了提高效率而select其中一个,是一个毫无价值的微观优化,除非你的应用程序正在开始以检查为生。

这是你不关心绩效的最简单的答案:

 if (strpos($string, '_') === 0) { # code } 

如果strpos返回0这意味着你正在寻找的是字符0开头的string。

这里详细logging: 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, "_"); 

这里有一个更好的函数开始

 function mb_startsWith($str, $prefix, $encoding=null) { if (is_null($encoding)) $encoding = mb_internal_encoding(); return mb_substr($str, 0, mb_strlen($prefix, $encoding), $encoding) === $prefix; } 

为了回应松博格的回答,并回应了甘博对此答案的评论:

 function has_leading_underscore($string) { return $string[0] === '_'; } 

在PHP 5.3.0上运行,以下工作并返回所需的值,即使不检查string是否至less有1个字符的长度:

 echo has_leading_underscore('_somestring').', '; echo has_leading_underscore('somestring').', '; echo has_leading_underscore('').', '; echo has_leading_underscore(null).', '; echo has_leading_underscore(false).', '; echo has_leading_underscore(0).', '; echo has_leading_underscore(array('_foo', 'bar')); /* * output: true, false, false, false, false, false, false */ 

我不知道其他版本的PHP会如何反应,但是如果它们都工作,那么这个方法可能比substr路由更有效率。