文字列を探すということ
プログラムの中で、ある文字列(文とか単語とかファイル名とか配列とか)の中から、特定の文字を探して、次にXXの処理をするという事例は多々あります。
単純に文字を検索するだけでなく、その速度や精度も大事です。
その検索の仕方も色々あるので、使用頻度の高いものを紹介したいと思います。
strpos() で最初に現れる場所を探す
strpos() は、検索したい文字が、対象文字列の中から、最初に現れる場所を見つける関数です。
strrpos() との違いは、strpos は最初に現れる場所、strrposは最後に現れる場所を探します。
戻り値は、0から開始した数字で返し、見つからないときはfalseを返します。
探し始める位置は、デフォルトで0番目です。負の数で後ろから検索します。
strpos(string
$haystack
, string$needle
, int$offset
= 0);$haystack:検索対象の文字列
PHPマニュアル
$needle:検索したい文字
$offset:検索開始位置
検索文字列が見つからないときは 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:検索対象の文字列
PHPマニュアル
$needle:検索したい文字
$offset:検索開始位置
検索文字列が見つからないときは 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:検索対象の文字列
PHPマニュアル
$needle:検索したい文字(文字列の場合、大文字小文字を区別します)
$before_needle:true にすると戻り値は最初に$needleが現れる場所より前の部分で$needle含めず
戻り値は、見つかった部分からの部分文字列となり、見つからなかった場合は 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:検索するパターンを表す文字
PHPマニュアル
$subject:検索対象の文字列
$$matches:指定すると、検索結果がここに代入されます。$matches[0]パターン全体にマッチしたテキスト,$matches[1]サブパターンにマッチした 文字列
$flags:PREG_OFFSET_CAPTURE
(matchesの値を配列化),PREG_UNMATCHED_AS_NULL
(マッチしなかったサブパターンはnullになる)
$offset:検索の開始位置
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:検索文字
PHPマニュアル
$haystack:検索対象の配列
$strict:trueに設定すると型の確認をして比較する
戻り値は、見つかったときは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:検索文字(文字列の場合、大文字小文字を区別します)
PHPマニュアル
$haystack:検索対象の配列
$strict:trueに設定すると型の確認をして厳密な比較をする
戻り値は、見つかった場合は最初に見つかった配列のキーを、それ以外の場合は false を返します。
//対象の配列
$strings = array("dir0", "dir1", "dir2", "dir3");
//検索したい文字
$search_word = "dir2";
$key = array_search($search_word, $strings);
if ($key !== false) {
echo $key;
} else {
echo "見つかりません";
}
実行結果:2