2010-03-07 70 views
19
if(strpos("http://www.example.com","http://www.")==0){ // do work} 

我希望这可以解决它的真实性。但是,当我做php 5 strpos()返回0和false之间的区别?

if(strpos("abcdefghijklmnop","http://www.")==0){// do work} 

这也传递PHP 5,因为据我可以计算出对strpos返回false意为0

这是正确的思想/行为会发生什么?如果是的话,那么测试这个子字符串是在另一个字符串的开头是什么?

回答

39

是的,这是正确的/预期的行为:

  • strpos可以返回0当有比赛在的开始字符串
  • 并且当没有匹配时它将返回false

事情是你不应该使用==来比较0false;你应该使用===,像这样:

if(strpos("abcdefghijklmnop","http://www.") === 0) { 

} 

或者:

if(strpos("abcdefghijklmnop","http://www.") === false) { 

} 


欲了解更多信息,请参见Comparison Operators

  • $a == $bTRUE如果$a等于$b
  • $a === $bTRUE如果$a等于$b,和它们是相同类型的

而且,引述the manual page of strpos

这个函数可以返回布尔 FALSE,但也可以返回 非布尔值,其结果为 FALSE,如0""
请 在Booleans上阅读 的更多信息。
使用the === operator来测试此函数的返回值 的值。

9

===!==比较类型值:

if (strpos("abcdefghijklmnop", "http://www.") !== false){// do work} 
4

strpos返回int或布尔值false。 ==运算符也会将0计算为false,您希望使用===运算符(三个等号),该运算符还会检查被比较的类型是否相同,而不是仅仅查看它们是否可以被评估为相同。

所以

if (strpos($hastack, $needle) === 0) 
{ 
    // the $needle is found at position 0 in the $haystack 
} 
1

0strpos一个可能的返回值,当它找到一个匹配在开始的时候。如果未找到匹配项,则返回false(布尔值)。因此,您需要使用===运算符检查strpos的返回值,该运算符将检查值和类型,而不是使用仅检查值的==

0

我个人倾向于用这种方式:

if(!strpos($v,'ttp:'))$v='http://'.$v; 

if(strpos(' '.$v,'http')) 

避免 “0” 位置,然后总是使它成为一个人数超过0 欢呼

+1

如果您代码使用非标准的非标准方式来解决标准问题,所有的可维护性已经离开了建筑物。每个体面的PHP开发人员都知道并期待'==='符号 - 你的回答只是提供了一个过时的性能和可读性杀手。 – 2015-05-26 10:55:43

相关问题