【PHP】strpos関数で文字列が特定の文字を含んでないか調べるときの注意点


はじめに

strpos関数使って文字列のチェックを行う際に、想定外の挙動になって少しあせったので自戒の念を込めて記事にします。PHPあるあるな内容だと思います。

strpos関数について簡単に

strposは文字列内の部分文字列が最初に現れる場所を見つけることができます。

もう少し詳しく説明すると、
文字列の中に特定の文字が含まれている場合はその位置の数値
含まれていない場合はfalse
を返します。

公式マニュアル:PHP: strpos - Manual
※ちなみに本記事の以降の内容はマニュアル内でしっかり言及されていました。みんな、しっかりマニュアル読もうね。

注意点

  • strposを使って、特定の文字を含んでないかをチェックする場合は厳密比較を使う。

厳密比較とは===を使った比較のことです。

反対に、曖昧比較は==を使った比較のことです。
また、if (!strpos($string ,$findme))のような書き方も曖昧比較になります。

(この辺について以前にも自戒記事を書いたのでぜひ!)
【PHP】比較演算子「==」の罠

曖昧比較の場合は0や'0'もfalse扱いになってしまうため、厳密比較を使わないと検索したい文字が検索対象の文字列の1文字目にあった場合に、falseになってしまいます。

例えば

<?php
$string = 'aiueo';
$findme = 'a';
if (!strpos($string ,$findme)) {
    echo '含まれてないよ';
} else {
    echo '含まれてるよ';
}

この場合だと'含まれてないよ'と出力されてしまいます。
検索したい文字列'a'が検索対象の1文字目(0番目)にあるので、
 strpos($string ,$findme)の返り値0が曖昧比較によりfalse扱いなることで、このような結果になります。

ですので、===を使って厳密比較することで

<?php
$string = 'aiueo';
$findme = 'a';

if (strpos($string ,$findme) === false) {
    echo '含まれてないよ';
} else {
    echo '含まれてるよ';
}

'含まれてるよ'と出力できます。

さいごに

PHPでは理由がない限り==ではなく===を使うのが一般的ですが、
falseで条件判定したいときに!を使って省略してしまいがちなので気をつけないといけませんね。PHPの比較の曖昧さにはなかなか苦労させられます。