【问题标题】:Why am I getting this unexpected result when using php strpos function?为什么我在使用 php strpos 函数时会得到这个意外结果?
【发布时间】:2014-05-20 09:18:35
【问题描述】:

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

【问题讨论】:

    标签: php string strpos


    【解决方案1】:

    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

    至于为什么你的sn-p

    echo strpos($string,':def') ? ':def true' : ':def false'; 
    

    返回 true - 在 PHP 中,每个非零整数都被视为 true,如果您将其作为布尔值进行比较,并且您的 strpos 返回值大于零(在此示例中可能为“4”),因此被认为是true。详情请见here

    【讨论】:

      【解决方案2】:

      根据 doc

      strpos()
      

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

      所以

      strpos($string,'abc:') 
      

      正在返回 0。所以它正在回显:

      abc: false
      

      【讨论】:

        【解决方案3】:

        在你的情况下strpos()返回true/false结果所以你需要根据返回结果检查 试试

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            猜你喜欢
            • 2021-07-10
            • 1970-01-01
            • 1970-01-01
            • 2023-03-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多