【PHP】文字列の検索(一致、有無)を調べる3つの方法
PHPで指定した文章(文字列)に検索したい文字列が含まれているかどうかを調べる方法を3つ紹介しています。
①strpos関数とstripos関数
strpos関数とstripos関数を使えば、指定した文章の中に検索したい文字列が存在するか簡単に調べることができます。
strpos("ここにターゲットとなる文章", "ここに検索したい文字列");
stripos("ここにターゲットとなる文章", "ここに検索したい文字列");
これらの関数は、「ターゲットとなる文章」に「検索したい文字列」が含まれていた場合、その位置を返します。見つからなかった場合はfalseを返します。
また、第3引数にオフセットを指定でき、指定した場合、検索開始位置はその位置からとなります。
なお、strpos関数とstripos関数の違いですが、stripos関数は大文字小文字を区別しないで文字列の検索を行います。
戻り値に注意
「ターゲットとなる文章」の開始位置は「0」であり「1」ではないことに注意する必要があります。
具体的には、次のようなコードがあった場合、
<?php
//ターゲット文章
$target_string = "昭和、平成、令和。3つの時代を生き抜いてきたおばあちゃん"
//検索したい文字列
$search_string = "昭和";
//検索を実行
if(strpos($target_string, $search_string)){
echo "ありました!";
}else{
echo "ありませんでした!";
}
?>
「ターゲットとなる文章」に「検索したい文字列(昭和)」が含まれているので、「ありました!」となるべきですが、実際は
ありませんでした!
となります。
その原因は、「昭和」という文字列が0文字目にあるので戻り値が「0」となり、if関数の処理上「false」と判定されるからです。
サンプルプログラム
実際にstrpos関数(stripos関数でも同様)を使って文字列の検索を行うプログラムを実行してみたいと思います。
<?php
//ターゲット文章
$target_string = "おはようございます、こんにちは、こんばんは。「http://ysklog.net」です。「http://yahoo.co.jp」ではありません。";
//検索したい文字列
$search_string = "http";
//検索を実行
if(strpos($target_string, $search_string) !== false){
//見つかった時の処理
echo "見つかりました";
}else{
//見つからなかった時の処理
echo "見つかりませんでした";
}
?>
これを実行すると、「$target_string」に「http」という文字列が含まれるので次のような結果となります。
見つかりました
戻り値の確認
念のためstrpos関数(stripos関数でも同様)で返される戻り値を確認しておきたいと思います。
<?php
//ターゲット文章
$target_string = "おはようございます、こんにちは、こんばんは。「http://ysklog.net」です。「http://yahoo.co.jp」ではありません。";
//検索したい文字列
$search_string = "http";
//戻り値をチェック
echo strpos($target_string, $search_string);
?>
上のプログラムを実行すると、次の値が返されます。
69
「え!?69!???なぜ?23じゃないの?」と疑問になりますが、これは検索ターゲット文章の中に日本語(マルチバイト)が含まれるからです。
このときの対処法はstrpos(stripos)関数で日本語(マルチバイト)を扱う時の注意点を参照して下さい。
②strstr関数とstristr関数
strstr関数とstristr関数を使っても、指定した文章の中に検索したい文字列が存在するか簡単に調べることができます。
strstr("ここにターゲットとなる文章", "ここに検索したい文字列");
stristr("ここにターゲットとなる文章", "ここに検索したい文字列");
これらの関数は、「ターゲットとなる文章」の中に「検索したい文字列」が含まれていた場合、そこから最後までの文字列を返してくれる関数です(見つからなかった場合はfalseを返す)。
なお、strstr関数とstristr関数の違いですが、stristr関数は大文字小文字を区別しないで文字列の検索を行います。
サンプルプログラム
実際にstrstr関数(stristr関数でも同様)を使って文字列の検索を行うプログラムを実行してみたいと思います。
<?php
//ターゲット文章
$target_string = "おはようございます、こんにちは、こんばんは。「http://ysklog.net」です。「http://yahoo.co.jp」ではありません。";
//検索したい文字列
$search_string = "http";
//検索を実行
if($get_string = strstr($target_string, $search_string)){
//見つかった時の処理
echo "見つかりました";
}else{
//見つからなかった時の処理
echo "見つかりませんでした";
}
?>
このプログラムを実行すると、「$target_string」に「http」は含まれるので次のようになります。
見つかりました
戻り値の確認
戻り値の確認ですが、次のように検索が成功した場合、
<?php
//ターゲット文章
$target_string = "おはようございます、こんにちは、こんばんは。「http://ysklog.net」です。「http://yahoo.co.jp」ではありません。";
//検索したい文字列
$search_string = "http:";
//戻り値をチェック
echo strstr($target_string, $search_string);
?>
次の値が返されます。
http://ysklog.net」です。「http://yahoo.co.jp」ではありません。
なお、strstr関数(stristr関数でも同様)の第3引数を「true」にする(「before_needle」を利用する)と戻り値は検索できたところより前の部分を返してくれます。
<?php
//ターゲット文章
$target_string = "おはようございます、こんにちは、こんばんは。「http://ysklog.net」です。「http://yahoo.co.jp」ではありません。";
//検索したい文字列
$search_string = "http:";
//戻り値をチェック
echo strstr($target_string, $search_string, true);
?>
これを実行すると次の戻り値が返されます。
おはようございます、こんにちは、こんばんは。「
ワンポイント
ここまでstrpos関数(stripos関数)とstrstr関数(stristr関数)を使って文字列の検索を行う方法を紹介しましたが、特に理由がない場合はstrpos関数(stripos関数)を利用するのが良いです。
それは、strpos関数(stripos関数)の方がstrstr関数(stristr関数)よりもメモリ消費が少なくて高速で動くからです。
③preg_match関数
単純にターゲット文章に検索したい文字列が存在するか確認する場合、strpos関数(stripos関数)を使うのが良いですが、正規表現を利用した文字列検索を行いたい場合はpreg_match関数を使います。
preg_match("/ここに検索したい文字列(正規表現の利用可)/", "ここにターゲットとなる文章");
この関数は、第1引数に検索したい文字列(正規表現の利用可)を指定し、第2引数にターゲット文章をセットします。
第2引数に第1引数で指定した文字列が存在すれば(マッチすれば)「1」を、マッチしなければ「0」を、マッチにエラーが生じた場合は「false」を返します。
サンプルプログラム
実際にpreg_match関数を使って文字列の検索を行うプログラムを実行してみたいと思います。
正規表現を使わずに検索
正規表現を使わずにターゲット文章の中に「こんばんは」という文字列が存在するか確認します。
<?php
//ターゲット文章
$target_string = "おはようございます、こんにちは、こんばんは。「http://ysklog.net」です。「http://yahoo.co.jp」ではありません。";
//検索を実行
if(preg_match("/こんばんは/", $target_string)){
//見つかった時の処理
echo "見つかりました";
}else{
//見つからなかった時の処理
echo "見つかりませんでした";
}
?>
この場合、ターゲット文章の中に「こんばんは」という文字列が存在する次のようになります。
見つかりました
正規表現を使って携帯の電話番号を検索
次に正規表現を使って携帯の電話番号(ハイフン「-」あり)がターゲット文章の中に存在するか確認します。
<?php
//ターゲット文章
$target_string = "はじめまして「http://ysklog.net」です。私の携帯番号は090-1234-5678です。この番号はテキトーです。";
//検索を実行
if(preg_match("/[0-9]{3}-[0-9]{4}-[0-9]{4}/", $target_string)){
//見つかった時の処理
echo "見つかりました";
}else{
//見つからなかった時の処理
echo "見つかりませんでした";
}
?>
この場合、ターゲット文章の中に携帯番号が存在するので次のようになります。
見つかりました
正規表現でマッチした文字列を抽出する方法
preg_match関数は、正規表現を使って文字列の検索が出来るだけでなく、正規表現でマッチした部分の文字列を抽出することも可能です。
その方法ですが、preg_match関数の第3引数を利用するだけで、すべての検索結果が取得可能となります。
この詳しい方法ですが、preg_match関数を使って複数の値を配列に入れる方法を参照して下さい。
あわせて読んでほしい!
コメント
まだコメントはありません。