web-dev-qa-db-ja.com

PHP 5 strpos()は0とfalseを返しますか?

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

私はこれがtrueとして解決することを期待しますが、実際には解決します。しかし、私が行うとどうなりますか

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

Strposが0に変換されるfalseを返すため、これはphp 5にも渡されます。

これは正しい考え方/行動ですか?もしそうなら、その部分文字列が別の文字列の先頭にあることをテストするための回避策は何ですか?

21
rutherford

はい、これは正しい/予想される動作です:

  • strposは、文字列の先頭に一致がある場合に0を返すことができます
  • 一致しない場合はfalseを返します

重要なのは、==falseを比較するために0を使用してはならないということです。次のように===を使用する必要があります。

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

}

または:

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

}


詳細については、 比較演算子 を参照してください。

  • $a == $b$aと等しい場合、$bTRUEになります。
  • $a === $b$aと等しい場合、$bTRUEであり、それらは同じ型

そして、 strpos のマニュアルページを引用します:

この関数はブール値FALSEを返す場合がありますが、0""など、FALSEと評価される非ブール値を返す場合もあります。
詳細については、 Booleans のセクションをお読みください。
この関数の戻り値をテストするには、 ===演算子 を使用します。

51
Pascal MARTIN

===および!==以下に示すように、タイプand値を比較します。

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

strposは、intまたはboolean falseを返します。 ==演算子も0を評価してfalseを意味します。=が評価されるかどうかを単に比較するのではなく、比較される型が同じであることを確認する===演算子(3つの等号)を使用したいとします。

そう

if (strpos($hastack, $needle) === 0)
{
    // the $needle is found at position 0 in the $haystack
}
5
Kris

0は、最初に一致が見つかった場合のstrposからの可能な戻り値です。一致が見つからない場合は、false(boolean)を返します。したがって、値をチェックするだけの===を使用するのではなく、値とタイプをチェックする==演算子を使用してstrposの戻り値をチェックする必要があります。

1
codaddict