PHPでは文字列を検索するための関数が用意されていますが、どんな関数を使うべきでしょうか?
また、日本語が混ざった文字列と英数字だけの文字列では使う関数が違うのでしょうか?
今回ではstrpos関数とmb_strpos関数をメインに解説をしています。
この記事では
[基礎] mb_strpos関数を使用してマルチバイト文字列を検索する方法
[基礎] strstr関数を使用して文字列を検索する方法
[実践] 配列変数に対してstrposを使いたい場合
といった解説をしていきます!
strposで文字列を検索する方法
strposとは
strpos関数は検索文字列が見つかったら、見つかった文字列の最初の位置を取得します。
書き方:
strpos ( $検索対象文字列 , $検索文字列 [, $オフセット = 0 [, $文字コード ]] )
例:
strpos ( 'World', 'Hello World' );
引数:
第一引数には検索を行う文字列を指定し、第二引数には検索する文字列を指定します。
検索文字列が文字列ではない場合は、それを整数に変換してその番号を文字列として扱います。
第三引数のオフセットは検索開始位置を指定します。負の数を指定すると、文字列の末尾からその数だけ戻った位置から検索します。
返り値:
検索文字列が見つかった場合は、文字列の先頭からの相対位置を返します。
ちなみに、文字列の先頭で見つかった場合は、1ではなく0を返します。
strposの使い方
以下にstrpos関数を使用して、文字列を検索するサンプルを紹介します。
サンプルプログラム
'; echo '文字列'.$search.'の位置は'.$pos.'番目です。'; }else{ echo '文字列'.$search.'は存在しません'; } ?>
実行結果:
文字列Orangeは存在します。 文字列Orangeの位置は5番目です。
検索対象文字列「AppleOrangeMelon」に対して、検索する文字列「Orange」は存在するのでif文の判定処理に入り、文字列が見つかった位置が取得できていることがわかりますね!
strposの注意点
PHPでは型の指定をしないと、数値の0とfalseは同じものと見なされます。
そのため、strpos関数の戻り値の比較には注意が必要です。
以下は、strpos関数の戻り値を型の指定をせずに比較したサンプルです。
<?php //検索対象文字列 $str = 'Samurai Engineer blog'; //検索する文字列 $search = 'Samurai'; //指定した文字列を検索する $pos = strpos($str, $search); if ($pos){ echo '文字列'.$search.'は存在します。<br>'; echo '文字列'.$search.'の位置は'.$pos.'番目です。'; }else{ echo '文字列'.$search.'は存在しません'; } ?>
実行結果 文字列Samuraiは存在しません
検索対象文字列’Samurai Engineer blog’に対して、検索する文字列’Samurai’は0番目に存在します。
しかし、「if ($pos)」で型の指定をせずに比較しているためfalseと見なされ、else文の処理が実行されてしまいます。
ここでは必ず、「if ($pos !== false)」と型の判定も含めて書く必要があります。
検索する文字列が存在するかどうかを判定するには、strstr関数もstrpos関数も使用することができますが、strpos関数の方が処理速度が速く、メモリ消費も少ないので、strpos関数を使用するようにしましょう。
検索位置を指定する
検索対象文字列の検索位置を指定するには、strpos関数の第三引数にオフセットを指定する必要があります。
以下にオフセットを指定して、文字列を検索する方法を記述します。
<?php //検索対象文字列 $str = 'today is rainy. It will rain tomorrow.'; //検索する文字列 $search = 'rain'; //指定した文字列を検索する $pos = strpos($str, $search, 14); echo '文字列'.$search.'の位置は'.$pos.'番目です。'; ?>
実行結果 文字列rainの位置は24番目です。
サンプルでは検索する文字列’rain’は、検索対象に2つ含まれていますが、strpos関数の第三引数で文字列の14番目からの検索を指定しています。
そのため、strpos関数の返り値は検索対象文字列の2つ目にヒットした検索位置を返します。
mb_strposでマルチバイト文字列を検索する
mb_strposとは
strpos関数は日本語などのマルチバイト文字列も検索することができますが、正しい検索位置を返してくれません。
そのため、マルチバイト文字列検索するには、strpos関数を拡張したmb_strpos関数を使用します。
書き方:
mb_strpos ( $検索対象文字列 , $検索文字列 [, $オフセット = 0 [, $文字コード ]] )
引数:
mb_strpos関数は第三引数まではstrpos関数と同様ですが、 第四引数で文字コードを指定できます。
文字コードを省略した場合は内部文字エンコーディングが使用されます。
返り値:
検索して見つかった文字列を含むそれ以降の文字列を返します。
見つからなかった場合はFALSEを返します。
mb_strposの使い方
以下に日本語の文字列をstrpos関数とmb_strpos関数でそれぞれ検索する方法を紹介します。
検索結果の違いに注目してください。
サンプルプログラム
//検索対象文字列 $str = 'サムライエンジニアブログ'; //検索する文字列 $search = 'エンジニア'; //指定した文字列を検索する $pos = strpos($str, $search); $pos_mb = mb_strpos($str, $search); echo 'strposでの検索結果位置:'.$pos; echo '<br>'; echo 'mb_strposでの検索結果位置:'.$pos_mb;
実行結果:
strposでの検索結果位置:12 mb_strposでの検索結果位置:4
実行結果のとおり、strpos関数では文字列が見つかった位置が12番目という結果となってしまいます。
しかし、日本語マルチバイト文字列に対応したmb_strpos関数では正しい位置を返していることがわかります。
そのため、strpos関数とmb_strpos関数は、英数字と日本語などのマルチバイト文字列で、使い分けるようにしましょう。
配列の中の文字列をstrposを使って検索したい
配列の中の文字列を検索したい場合どうすればよいでしょうか?
strpos_arrayといった関数があればよいのですが、ありません。
そのため次のような形で自作する必要があります。
<?php $fruits = [ 'Apple', 'Melon', 'WaterMelon' ]; echo strpos_array('Melon', $fruits, 0); function strpos_array($haystack, $needle, $offset = 0, $is_index = FALSE) { $ary = $needle; $pos = 0; if(!is_array($needle)) { $ary = [$needle]; } foreach($ary as $key => $str) { $pos = strpos($haystack, $str, $offset); if($pos === false) { continue; } if($is_index) { return $key; } return $pos; } return FALSE; } ?>
この自作したstrpos_array関数では第一引数には検索したい文字列を、第二引数には検索対象となる配列を指定します。
第三引数はstrposと同じくオフセットを指定します。
これは省略可能です。
第四引数がTRUEの場合は文字列の場所ではなく文字列を発見した要素数を返します。
strstrで文字列を検索する方法
strstrとは
strstr関数は、文字列が最初に現れる位置を検索し、見つかった位置から最後までの文字列を返します。
書き方:
strstr ( $検索対象文字列 , $検索文字列 [, bool $見つかった位置より前の文字列を返すか ] )
引数:
第一引数には検索を行う文字列を指定し、第二引数には検索する文字列を指定します。
検索文字列が文字列ではない場合は、それを整数に変換して、その番号を文字列として扱います。
第三引数にtrueを指定すると、戻り値として文字列が見つかった位置より前の文字列を返します。
返り値:
検索して見つかった文字列を含むそれ以降の文字列を返します。
見つからなかった場合はFALSEを返します。
strstrの使い方
以下にstrstr関数を使用して、指定した文字列が存在するか?確認するサンプルを紹介します。
サンプルプログラム1
//検索対象文字列 $str = 'AppleOrangeMelon'; //検索する文字列 $search = 'Orange'; //指定した文字列を検索する echo strstr($str, $search);
実行結果:
OrangeMelon
検索対象文字列「AppleOrangeMelon」に対して、検索する文字列「Orange」を指定し、Orangeを含むそれ以降の文字列が返されていることがわかりますね!
また、strstr関数は大文字小文字を区別して検索を行います。
そのため、以下のように検索する文字列を大文字にすると、FALSEを返しますので注意しましょう。
サンプルプログラム2
//検索対象文字列 $str = 'AppleOrangeMelon'; //検索する文字列 $search = 'ORANGE'; //指定した文字列を検索する var_dump(strstr($str, $search));
実行結果:
bool(false)
上記サンプルのように、単語が同じでも大文字小文字で区別して検索されますのでFALSEが返されます。
大文字小文字を区別しないで検索を行いたい場合は、stristrを使用します。
以下にstristrを使用して、文字列を検索するサンプルを紹介します。
サンプルプログラム3
//検索対象文字列 $str = 'AppleOrangeMelon'; //検索する文字列 $search = 'ORANGE'; //指定した文字列を検索する var_dump(stristr($str, $search));
実行結果:
string(11) "OrangeMelon"
文字列の使い方についてもっと詳しく知りたい方へ
ここで紹介した文字列の検索以外にも、
- 文字列を作成する方法
- 文字列を出力する方法
- 文字列を置換する方法
- 文字列を分割する方法
などの文字列のさまざまな使い方については、以下の記事にまとめていますので、ぜひ参考にしてくださいね!
PHPについてもっと知りたい方へ
いかがでしたでしょうか?
PHPは文字列を検索する方法だけでもさまざまな関数を使用できることがわかりましたね!
「PHPについて実はいまいちわかっていない・・・」
「もっとPHPについて詳しく知りたい!」
と思っている方は以下の記事も参考にしてみてください。
まとめ
ここでは、文字列を検索する方法について、
- strstr関数を使用して文字列を検索する方法
- strpos関数を使用して文字列を検索する方法
- strpos関数の注意点
- strpos関数で検索位置を指定する方法
- mb_strpos関数でマルチバイト文字列を検索する方法
- 正規表現で検索する方法
などについて解説しました。
strstr関数、strpos関数を使用すれば、基本的な文字列検索が可能です。
strpos関数は文字列の位置を指定して検索することもできます。
もし、文字列を検索する方法を忘れてしまったら、この記事を思い出してくださいね。