文字列の中を検索した文字列が含まれているのか調べたい時があります。

自作でアクセスランキングを作成した時にはリファラーURLをカウントしたり削除したり。
ブログなどにあるコメント機能を作成した時はコメント内にNGワードが含まれているのかチェックしたい。

そんな時に文字列を比較して一致する文字列が含まれているのかチェックする方法を紹介します。

正規表現を使わず比較する

strposを使う方法


strposは文字列が見つからなければfalseを返し、文字列が見つかれば最初に現れた場所を数値で返す。

strposは文字列の大文字小文字を区別します。

区別したくない場合はstriposを使ってください。

比較演算子は「===」「!==」を使用しましょう。

先頭で文字が見つかった場合は「0」が返され「== false」「!= false」とした場合など期待通りには動作しないのです。

使い方
strpos(“文字列”, “検索する文字列”);
if(strpos($string,'abc') === false){
    //abcが含まれていない場合
}

if(strpos($string,'abc') !== false){
    //abcが含まれている場合
}
注意

「== false」「!= false」とした場合。

先頭にマッチした場合は期待した動作になりません。

注意してください。


$string = 'abcdef';

if(strpos($string,'abc') == false){
    //abcが含まれていない場合
    //0が返されるのでifの中の処理がされる。
}

if(strpos($string,'abc') != false){
    //abcが含まれている場合
    //0が返されるのでifの中の処理はされない。
}

strstrを使う方法


strstrは文字列が見つからなければfalseを返し、文字列が見つかれば現れた場所を含めて文字列の終わりまで返します。

strstrは文字列の大文字小文字を区別します。

区別したくない場合はstristrを使ってください。

使い方
strstr(“文字列”, “検索する文字列”);
if(strstr($string,'abc') === false){
    //abcが含まれていない場合
}

if(strstr($string,'abc') !== false){
    //abcが含まれている場合
}

正規表現を使って比較する

正規表現を使って比較する場合はpreg_matchを使います。

preg_matchは正規表現を使ってマッチしたパターンの文字列を取得したり、文字列が正しいパターンかチェックしたりもできます。

ここでは検索した文字列が含まれているかという使い方をします。

preg_matchはマッチした場合に 1を返しマッチしなかった場合は0、エラーが発生した場合はfalseを返します。

使い方
preg_match(“/検索する文字列/”, “文字列”);
if(preg_match('/abc/', $string)){
    //abcが含まれていない場合
}

if(!preg_match('/abc/', $string)){
    //abcが含まれている場合
}

まとめ

基本的には紹介したどのやり方をとっても問題はないと思います。

ただ、高速でメモリ消費量が少ないのは「strpos」を使った方法です。

strstrのPHPマニュアルに

もし特定の haystack に needle があるかどうかを調べるだけの場合、 より高速でメモリ消費も少ない strpos() を代わりに使用してください。

と書かれているので「strpos」を使った方法をおすすめします。