php strpos() 返回 0 和 false 之间的区别是什么?

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

我希望这个问题能够得到解决,并且它确实得到了解决。但是当我这样做的时候会发生什么呢?
if(strpos("abcdefghijklmnop","http://www.")==0){// do work}

这也适用于php 5,因为据我所知,strpos返回false,而false被翻译为0。
这种思考/行为是正确的吗?如果是的话,那么如何测试一个子字符串是否位于另一个字符串的开头?
5个回答

64

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

  • strpos 在字符串开头匹配时会返回0
  • 当没有匹配时,它将返回false

问题在于你不应该使用==来比较0false;你应该使用===,像这样:

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

}

或者:

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

}


有关更多信息,请参见比较运算符

  • $a == $b将在$a等于$b时返回TRUE
  • $a === $b将在$a等于$b且它们的类型相同时返回TRUE

引用strpos手册页面的话:

此函数可能返回布尔值FALSE,但也可能返回一个非布尔值,该值被视为FALSE,例如0""
请阅读布尔类型部分以获取更多信息。
使用=== 运算符来测试此函数的返回值。


14

===!==比较类型值,如下所示:

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

对于 strpos() 函数,这个答案是最好的。 - Sergey Fedirko

5

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

所以

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

1

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


-2

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

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

或者

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

为了避免“0”位置,始终将其设置为大于0的数字。 干杯


5
如果你的代码使用非标准的方式和非标准的符号来解决标准问题,那么可维护性已经荡然无存。每个合格的 PHP 开发者都知道并期望 === 符号 - 你的回答只会带来过时的性能和可读性问题。 - Niels Keurentjes
我认为这只是伪代码。读者们,请考虑此内置函数的适当返回类型。 - WiiLF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接