php 5 strpos()返回0和false之间的区别?

rut*_*ord 20 php strpos

if(strpos("http://www.example.com","http://www.")==0){ // do work}
Run Code Online (Sandbox Code Playgroud)

我希望这能解决它的真实性.但是当我这样做时会发生什么

if(strpos("abcdefghijklmnop","http://www.")==0){// do work}
Run Code Online (Sandbox Code Playgroud)

这也传递了PHP 5,因为我可以解决strpos返回false,转换为0.

这是正确的思考/行为吗?如果是这样,那么测试子字符串的解决方法是在另一个字符串的开头?

Pas*_*TIN 51

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

  • strpos0当字符串开头有匹配时可以返回
  • false当没有匹配时它会返回

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

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

}
Run Code Online (Sandbox Code Playgroud)

要么 :

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

}
Run Code Online (Sandbox Code Playgroud)


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

  • $a == $bTRUE如果$a等于$b.
  • $a === $bTRUEif $a等于$b,并且它们属于同一类型.

并且,引用手册页strpos:

此函数可能返回布尔值 FALSE,但也可能返回一个非布尔值,其值为 FALSE,例如0"". 有关更多信息,
请阅读有关布尔值的部分.
使用=== 运营商的测试此函数的返回值.


Ign*_*ams 11

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

if (strpos("abcdefghijklmnop", "http://www.") !== false){// do work}
Run Code Online (Sandbox Code Playgroud)


Kri*_*ris 5

strpos返回一个int或boolean false.==运算符也计算0表示false,你想使用===运算符(三个等号),它还检查被比较的类型是否相同,而不仅仅是看它们是否可以被评估为相同.

所以

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