使用php strpos函数时为什么会出现这种意外结果?

时间:2014-05-20 09:18:35

标签: php string strpos

我正在尝试使用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

4 个答案:

答案 0 :(得分:2)

Strpos返回给定字符串(needle)在其他字符串(堆栈)中的位置。参见参考 - 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返回值大于零(可能&#39; 4&#39;在此例如),因此它被认为是true。有关详细信息,请参阅here

答案 1 :(得分:1)

根据 doc

strpos()

在haystack字符串中查找第一次出现针的数字位置。 返回针存在于相对于haystack字符串开头的位置(与offset无关)。另请注意,字符串位置从0开始,而不是1.

所以

strpos($string,'abc:') 

返回0.所以它回应:

abc: false

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

您需要使用布尔比较,并且仅在没有匹配时返回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