脱初心者備忘録

PHPで文字列を検索する方法

文字列を探すということ

プログラムの中で、ある文字列(文とか単語とかファイル名とか配列とか)の中から、特定の文字を探して、次にXXの処理をするという事例は多々あります。
単純に文字を検索するだけでなく、その速度や精度も大事です。
その検索の仕方も色々あるので、使用頻度の高いものを紹介したいと思います。

strpos() で最初に現れる場所を探す

strpos() は、検索したい文字が、対象文字列の中から、最初に現れる場所を見つける関数です。
strrpos() との違いは、strpos は最初に現れる場所、strrposは最後に現れる場所を探します。
戻り値は、0から開始した数字で返し、見つからないときはfalseを返します。
探し始める位置は、デフォルトで0番目です。負の数で後ろから検索します。

strpos(string $haystack, string $needle, int $offset = 0);

$haystack:検索対象の文字列
$needle:検索したい文字
$offset:検索開始位置

PHPマニュアル

検索文字列が見つからないときは false を返すので、見つかったときの0番目の0と明確に分けるため、比較には === を使う必要があります。

//対象の文字列
$filename = "dir1/dir2/test1.txt";

//検索したい文字
$search_word = "dir2";

$place = strpos($filename, $search_word);

if( $place !== false){
    echo $place . "番目に見つかりました。";
} else {
    echo "見つかりません";
}

実行結果:5番目に見つかりました。

strrpos() で最後に現れる場所を探す

strrpos() は、検索したい文字が、対象文字列の中から、最後に現れる場所を見つける関数です。
戻り値は、0から開始した数字で返し、見つからないときはfalseを返します。
探し始める位置は、デフォルトで0番目です。負の数で後ろから検索します。

strrpos(string $haystack, string $needle, int $offset = 0);

$haystack:検索対象の文字列
$needle:検索したい文字
$offset:検索開始位置

PHPマニュアル

検索文字列が見つからないときは false を返すので、見つかったときの0番目の0と明確に分けるため、比較には === を使う必要があります。

//対象の文字列
$filename = "dir1/dir2/test1.txt";

//検索したい文字
$search_word = "dir2";

$place = strrpos($filename, $search_word);

if( $place !== false){
    echo $place . "番目に見つかりました。";
} else {
    echo "見つかりません";
}

実行結果:5番目に見つかりました。

strstr() で最初に現れる場所を探す

strstr() は、検索したい文字が、対象文字列の中から、最初に現れる場所を見つける関数です。
strpos() との違いは、strpos() は見つけた位置を返すのに対し、strstr() は見つけた場所から最後までの文字列を返す点と、大文字小文字も区別する点です。

strstr(string $haystack, string $needle, bool $before_needle = false);

$haystack:検索対象の文字列
$needle:検索したい文字(文字列の場合、大文字小文字を区別します)
$before_needle:true にすると戻り値は最初に$needleが現れる場所より前の部分で$needle含めず

PHPマニュアル

戻り値は、見つかった部分からの部分文字列となり、見つからなかった場合は false を返します。

//対象の文字列
$filename = "dir1/dir2/test1.txt";

//検索したい文字
$search_word = "dir2";

$place = strstr($filename, $search_word);

if($place !== false) {
  echo $place;
} else {
  echo "見つかりません";
}

実行結果:dir2/test1.txt

正規表現で探す(preg_match())

正規表現とは、プログラミングにおいて、文字列のパターンマッチングを行う機能のことをいいます。
preg_match() は、正規表現によるマッチングを行う関数です。
パターンで指定した正規表現により、検索文字列を探します。

preg_match(

    string $pattern,

    string $subject,

    array &$matches = null,

    int $flags = 0,

    int $offset = 0

);

$pattern:検索するパターンを表す文字
$subject:検索対象の文字列
$$matches:指定すると、検索結果がここに代入されます。$matches[0]パターン全体にマッチしたテキスト,$matches[1]サブパターンにマッチした 文字列
$flags:PREG_OFFSET_CAPTURE(matchesの値を配列化), PREG_UNMATCHED_AS_NULL(マッチしなかったサブパターンはnullになる)
$offset:検索の開始位置

PHPマニュアル

preg_match() の戻り値は、マッチした場合に1を返します。無ければ0かfalseを返しますので、比較には===を使う必要があります。

//対象の文字列
$filename = "dir1/dir2/test1.txt";

//検索したい文字
$search_word = "dir2";

$place = preg_match('/' . $search_word .'/', $filename, $matches);

if ($place === 1) {
  print_r($matches);
} else {
  echo "見つかりません";
}

実行結果:Array ( [0] => dir2 )

strpos() と preg_match() では、実行速度に4倍の違いがあったので、探すだけならstrpos() をおすすめ。

in_array() で配列の中から検索する

in_array() は、配列の中に、検索文字があるかどうか探す関数です。
strictを指定すると、型の比較も行います。

in_array(mixed $needle, array $haystack, bool $strict = false);

$needle:検索文字
$haystack:検索対象の配列
$strict:trueに設定すると型の確認をして比較する

PHPマニュアル

戻り値は、見つかったときはtrue、それ以外は、false となっています。

//対象の配列
$strings = array("dir0", "dir1", "dir2", "dir3");

//検索したい文字
$search_word = "dir2";

if(in_array($search_word, $strings)) {
  echo in_array($search_word, $strings);
} else {
  echo "見つかりません";
}

実行結果:1

array_search() で配列の中から検索する

array_search() は、配列の中に、検索文字があるかどうか探す関数です。
in_array() と違うのは、見つかった場合に、対応する配列のキーを返すという点です。

array_search(mixed $needle, array $haystack, bool $strict = false);

$needle:検索文字(文字列の場合、大文字小文字を区別します)
$haystack:検索対象の配列
$strict:trueに設定すると型の確認をして厳密な比較をする

PHPマニュアル

戻り値は、見つかった場合は最初に見つかった配列のキーを、それ以外の場合は false を返します。

//対象の配列
$strings = array("dir0", "dir1", "dir2", "dir3");

//検索したい文字
$search_word = "dir2";

$key = array_search($search_word, $strings);

if ($key !== false) {
  echo $key;
} else {
  echo "見つかりません";
}

実行結果:2