为什么我得到这个意想不到的结果时,使用php strpos函数


Why am I getting this unexpected result when using php strpos function?

我试图使用php的strpos函数在另一个字符串中搜索字符串。我执行了2个不同的搜索,都包含一个冒号字符。我能看到两者之间的唯一区别是冒号是出现在"针"的开头还是结尾。

我的代码如下:
<?php
$string = 'abc:def';
echo strpos($string,'abc:') ? 'abc: true' : 'abc: false';
echo ' / ';
echo strpos($string,':def') ? ':def true' : ':def false'; 

得到的输出是abc: false / :def true。我不明白为什么,希望有人能给我解释一下。您可以在这里看到一个工作示例:

http://ideone.com/MyEn5d

Strpos返回给定字符串(指针)在其他字符串(堆栈)中的位置。参见reference - strpos。strpos的正确用法(注意它是!==而不是!=,因为我们还想检查类型):

$string = 'abc:def';
echo strpos($string,'abc:') !== false ? 'abc: true' : 'abc: false';
echo ' / ';
echo strpos($string,':def') !== false ? ':def true' : ':def false'; 

总结,strpos返回的数值是一个位置(例如0或5),如果没有找到该值,则返回false

关于为什么你的代码片段
echo strpos($string,':def') ? ':def true' : ':def false'; 

返回true -在PHP中,如果您将其作为布尔值进行比较,则每个非零整数都被视为true,并且您的strpos返回值大于零(在本例中可能为'4'),因此它被认为是true

as per doc

strpos()

查找在干草堆字符串中第一次出现的指针的数值位置。返回指针相对于干草堆字符串开头的位置(与偏移量无关)。还要注意字符串的位置从0开始,而不是1。

strpos($string,'abc:') 

返回0。所以它回显:

abc: false

在您的情况下strpos()返回true/false结果,因此您需要根据返回结果进行检查试着

echo strpos($string,'abc:') !== false ? 'abc: true' : 'abc: false';
echo ' / ';
echo strpos($string,':def') !== false ? ':def true' : ':def false'; 

您需要使用布尔比较,它只在没有匹配时返回false

$string = 'abc:def';
echo strpos($string,'abc:') !== false ? 'abc: true' : 'abc: false';
echo ' / ';
echo strpos($string,':def') !== false ? ':def true' : ':def false'; 
strpos($string, "abc") will return (int) 0
(int) 0 !== false ---> true statement
(int) 0 === true ---> false statement