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

我希望这可以解决,确实如此。但是当我这样做时会发生什么

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

这也传递给 php 5,因为据我所知 strpos 返回 false ,它转换为 0。

这是正确的想法/行为吗?如果是这样,测试子字符串是否位于另一个字符串的开头的解决方法是什么?

4

5 回答 5

60

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

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

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

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

}

或者 :

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

}


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

  • $a == $b将是TRUEif$a等于$b
  • $a === $b将是TRUEif$a等于$b,并且它们属于同一类型

并且,引用手册页strpos

此函数可能返回 Boolean FALSE,但也可能返回计算结果为 的非布尔值 FALSE,例如0""
请阅读有关布尔值的部分以获取更多信息。
使用 操作符===测试这个函数的返回值。

于 2010-03-07T15:15:37.267 回答
14

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

if (strpos("abcdefghijklmnop", "http://www.") !== false) {
     // do work     
}
于 2010-03-07T15:15:08.780 回答
5

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

所以

if (strpos($hastack, $needle) === 0)
{
    // the $needle is found at position 0 in the $haystack
}
于 2010-03-07T15:17:09.803 回答
1

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

于 2010-03-07T15:17:40.153 回答
-1

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

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

或者

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

为了避免“ 0”位置然后总是让它比0 欢呼更多

于 2013-01-13T12:58:11.440 回答