strpos() 意外执行错误分支[重复]

问题描述 投票:0回答:4

我正在尝试使用 PHP 的

strpos()
函数在另一个字符串中搜索一个字符串。我执行了两次不同的搜索,均包含冒号字符。我能看到两者之间的唯一区别是冒号是出现在“针”的开头还是结尾。

我的代码如下:

<?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

php string strpos
4个回答
2
投票

Strpos 返回给定字符串(针)在其他字符串(堆栈)中的位置。请参阅参考资料 - 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 
。请参阅此处了解更多详情。


1
投票

根据doc

strpos()

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

所以

strpos($string,'abc:') 

返回0。所以它是回显的:

abc: false

1
投票

在您的情况下strpos()返回

true/false
结果,因此您需要根据返回结果进行检查 尝试

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

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 
© www.soinside.com 2019 - 2024. All rights reserved.