開発ブログ

WWWクリエイターズが送る、Git、CSS、HTML、コマンドライン、Macの便利機能など、開発に関する役立ち情報発信します。気まぐれに更新。

PHP:特定の文字列を含むかチェックする方法、決定版。

最終更新:2017-07-23 by Joe

PHPで「対象の文字列が、特定の文字(文字列)を含むかどうか」の判定するための方法です。一緒に、PHPの文字列関数に関して、簡単にまとめました。

特定の文字列を含むかチェックする方法

「文字列を含むかどうか?」だけを調べたいのであれば「strpos()」関数を利用するのが、最も適切です。

strpos() を使った例

$heystack = 'Catch me, if you can.'; // 捜査対象となる文字列
$needle   = 'me'; // 見つけたい文字列

// 文字列が含まれるかどうかチェック
if ( strpos( $heystack, $needle ) === false ) {
  echo "見つかりませんでした・・。";
} else {
   echo "見つかりました!";
}

この関数を利用するとき、下記の振る舞いに注意を払う必要があります:

  • 返り値が「文字列が見つかった位置」を整数で返す。(開始位置は0である。)
  • 文字列が見つからなかった場合、falseを返す

よくある間違いに下記のようなチェックを行ってしまうケースがあります。

strpos() の誤った使用例

$heystack = 'Catch me, if you can.'; 
$needle   = 'Catch'; 

if ( strpos( $heystack, $needle ) ) {
  echo "見つかりました〜。";
} else {
  echo "見つかりませんでした。";  // 本当に、見つかりませんでしたか?
}

上記において、strpos()は「Catch」が見つかったとき、整数の「0」を返します。

整数のゼロは、IF判定で「否定」と捉えてしまいます。なぜなら、PHPでは、整数「0」はboolean変換において、falseに変換されるからです。

PHPにおけるbooleanの変換

説明 booleanにおける値
0 integerのゼロ FALSE
0.0 floatのゼロ FALSE
“” 空の文字列 FALSE
“0” 文字列のゼロ FALSE
array() 要素の数がゼロである配列 FALSE
NULL NULL(特別な値) FALSE
undefined 値がセットされていない変数 FALSE

その他の方法について

その他の方法もっとも汎用的に利用できる正規表現関数「preg_match()」を利用することももちろん可能です。

preg_match()を使った例

$subject = 'Catch me, if you can.'; 
$pattern = '/me/'; 

if ( preg_match( $pattern, $subject ) ) {
  echo "見つかりました!";
} else {
  echo "見つかりませんでした・・。;
}

「preg_match()」 は、マッチした場合は、「1」 を返し、マッチしなかった場合は 0、エラーが発生した場合は FALSE を返します。この返り値「strpos()」と異なりますので、上記のように判定を記載できます。

一方で、前述の「strpos()」は、「preg_match()」よりも消費メモリが少なく、パフォーマンスの面で優れるようです。よく似た関数に「strstr()」もありますが、こちらと比較しても「strpos()」が最速とされています。

PHPのString関数

PHPは文字列処理の関数が豊富にありますが、名前がよく似ていて、名前と関数の実際の振る舞いが覚えにくい事が多いです。

文字列を検出するPHP関数

関数名 大・小文字を区別しない場合の関数名 説明
strpos() stripos() 文字列内の部分文字列が最初に現れる位置を整数で返す。見つからなければ false。
strrpos() strripos() 文字列中に、ある部分文字列が最後に現れる位置を整数で返す。見つからなければ false。
strstr() stristr() 文字列が最初に現れる場所を含めてそこから文字列の終わりまでを返す。見つからなければ falseを返す。

日本語(マルチバイト)文字列の注意点

日本語の文字はマルチバイトと呼ばれ、取扱に注意が必要です。通常アルファベットや記号であれば、すべて1バイト(8ビット)で表現できたのですが、日本語は2バイト(16ビット)で表現されます。PHPの通常の関数は、1バイト文字を想定して設計されていますので、16ビットの文字を取り扱う時は、対応した関数を利用する必要があります。

参考

以上になります。

PHPにおいて文字列を含むかどうかの判定は、意外に出くわす機会が多いです。上記を覚えておけばきっと迷わないはずです。それでは。

閉じる