PHPで「対象の文字列が、特定の文字(文字列)を含むかどうか」の判定するための方法です。一緒に、PHPの文字列関数に関して、簡単にまとめました。
目次
特定の文字列を含むかどうか検索する方法
strpos() を使った文字列の検索
「文字列を含むかどうか?」だけを調べたいのであれば「strpos()」関数を利用するのが、最も適切です。単純な文字列検索では、正規表現関数「preg_match()」よりもパフォーマンス的にも優れているとされています。
この関数を利用するとき、下記の振る舞いに注意を払う必要があります:
- 返り値が「文字列が見つかった位置」を整数で返す。(開始位置は0である。)
- 文字列が見つからなかった場合、falseを返す
$heystack = 'Catch me, if you can.'; // 捜査対象となる文字列 $needle = 'me'; // 見つけたい文字列 // 文字列が含まれるかどうかチェック if ( strpos( $heystack, $needle ) === false ) { echo "見つかりませんでした・・。"; } else { echo "見つかりました!"; }
よくある間違いに、Boolean への型変換で、下記のような誤ったチェックを行ってしまうケースがあります。
strpos() の誤った使用例
strpos()は「Catch」が見つかったとき、整数の「0」を返します。整数のゼロは、IF判定で「否定」と捉えてしまいます。なぜなら、PHPでは、整数「0」はboolean変換において、falseに変換されるからです。
$heystack = 'Catch me, if you can.'; $needle = 'Catch'; if ( strpos( $heystack, $needle ) ) { echo "見つかりました〜。"; } else { echo "見つかりませんでした。"; // 本当に、見つかりませんでしたか? }
PHPにおけるBooleanへの型変換です。間違いやすいので、注意する必要があります。
PHPにおけるbooleanの変換
値 | 説明 | booleanにおける値 |
0 | integerのゼロ | FALSE |
0.0 | floatのゼロ | FALSE |
“” | 空の文字列 | FALSE |
“0” | 文字列のゼロ | FALSE |
array() | 要素の数がゼロである配列 | FALSE |
NULL | NULL(特別な値) | FALSE |
undefined | 値がセットされていない変数 | FALSE |
公式ドキュメントへのリンクです:
正規表現関数 preg_match() を使った検索
その他の方法もっとも汎用的に利用できる正規表現関数「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の通常の関数は、固定2バイト文字を想定して設計されていますので、マルチバイト文字を取り扱う時は、対応した関数を利用する必要があります。
PHPにおいて文字列を含むかどうかの判定は、意外に出くわす機会が多いです。上記を覚えておけばきっと迷わないはずです。それでは。
PHPの文字列検索に関する参考リンク