PHPで特定の文字列を含むか検索する方法について書いています。
下記の関数を使って、特定文字列が文字列に含まれるか検索することが可能です。
・mb_strpos関数
・strstr関数
・mb_strstr関数
・preg_match関数
サンプルコードは、PHPバージョン8.1.8で検証しています。
strpos関数で含むか確認する
strpos関数を使うと、対象文字列から検索文字列が見つかった位置を返します。
公式ドキュメントはこちらにあります。
例えば、下記のように使います。
<?php
$text = "hello world";
$result = strpos($text, "world");
if ($result !== false) {
echo "worldを含む:{$result}"; // worldを含む:6
}
$text変数に対象文字列「hello world」を代入しました。
次にstrpos関数を呼び出しています。
第1引数に検索対象文字列、第2引数に検索文字列を渡します。
今回は、対象文字列が「hello world」、検索文字列が「world」です。
見つかった場所を$result変数で受け取っています。
文字列を0番目から数えて、今回は「6」が返ってきます。
strpos関数では、見つからなかった場合にはfalseが返ってきます。
if文でfalseではなかった場合(見つかった時)に処理を通るようにしました。
結果、「worldを含む:6」が出力されて処理が終了します。
比較演算子に注意する
strpos関数から返された値を比較するときに注意が必要です。
最初の文字だった場合は、0が返ってくるためです。
下記のように「!=
」を使った場合には、if文でtrueになりません。
「0 == false
」はtrueのためです。
<?php
$text = "hello world";
$result = strpos($text, "h");
if ($result != false) {
echo "worldを含む:{$result}";
}
型まで同じか確認してくれる「!==
」を使う必要があります。
日本語の場合には位置が正しくない
日本語の場合には正しい位置が返ってきません。
例えば、下記のような場合です。
echo strpos("オーケー!グーグル", "グ"); // 15
文字列を0から数えると、探したい「グ」は5番目ですが、strpos関数は「15」を返します。
マルチバイト文字で使用する場合には、次項で紹介するmb_strpos関数を使いましょう。
先ほどの例もmb_strpos関数を使うと、5番目が返ってきます。
echo mb_strpos("オーケー!グーグル", "グ"); // 5
mb_strpos関数で含むか確認する
mb_strpos関数はstrpos関数のマルチバイト対応バージョンです。
公式ドキュメントはこちらにあります。
日本語の文字列でも文字位置を正しく返してくれます。
<?php
$text = "生麦生米生卵";
$result = mb_strpos($text, "米");
if ($result !== false) {
echo "米を含む:{$result}";
}
$text変数に検索対象文字列「生麦生米生卵」を代入しています。
次にmb_strpos関数を使って、検索対象文字列に「米」を指定しています。
$result変数に見つかった位置を受け取ります。
if文の処理を行います。
今回は、検索対象文字列を含んでいるので、「米を含む:3」を出力して処理が終了します。
日本語でも0番目から数えた位置が返ってきていることが確認できました。
strstr関数で含むか確認する
strstr関数でも文字列を含むか確認することが可能です。
公式ドキュメントはこちらにあります。
公式ドキュメントでも記載がありますが、strpos関数の方が高速で消費メモリも少ないため、単純に含むかを探す場合にはstrposを使いましょう。
strstr関数では下記のように、見つかった位置から末尾までの文字列を返します。
<?php
$text = "hello world!! strstr test!!";
$result = strstr($text, "wo");
if ($result !== false) {
echo "woを含む:{$result}";
}
$text変数に対象文字列「hello world!! strstr test!!」を代入しました。
次にstrstr関数を呼び出しています。
第1引数に検索対象文字列、第2引数に検索文字列を渡します。
strstr関数では、見つかった場所から末尾までを、文字列として返します。
見つかった文字列を$result変数で受け取っています。
見つからなかった場合にはfalseが返ってきます。
if文でfalseではなかった場合に処理を通るようにしました。
結果、「woを含む:world!! strstr test!!」が出力されて処理が終了します。
見つかった「wo」から末尾までの文字列が返ってきていることが確認できました。
mb_strstr関数で含むか確認する
mb_strstr関数はstrstr関数のマルチバイト対応バージョンです。
公式ドキュメントはこちらにあります。
strstr関数を使った場合には文字化けることがあるので、マルチバイト文字の場合にはmb_strstr関数を使います。
strstr関数と同じように、下記のように使うことが可能です。
<?php
$text = "焼肉定食!!!";
$result = mb_strstr($text, "肉");
if ($result !== false) {
echo "肉を含む:{$result}";
}
$text変数に対象文字列「焼肉定食!!!』を代入しました。
次にmb_strstr関数を呼び出しています。
第2引数に検索文字の「肉」を渡して、$text変数から探しています。
$resultで、見つかった箇所以降の日本語を、返り値として受け取ります。
if文でfalseではなかった場合に処理を通るようにしました。
結果、「肉を含む:肉定食!!!」が出力されて処理が終了します。
preg_match関数で含むか確認する
preg_match関数を使うと、正規表現を使って、文字列の中に含むかを確認することが可能です。
公式ドキュメントはこちらにあります。
例えば、下記のように使います。
<?php
$text = "apple100 banana200";
$result = preg_match("/[0-9]{3}/", $text);
if ($result) {
echo "数値3桁が含まれます!";
}
$text変数に対象文字列「apple100 banana200」を代入しました。
次にpreg_match関数を呼び出しています。
第1引数に正規表現、第2引数に検索対象文字列を渡します。
正規表現で「/[0-9]{3}/
」としているので、数値が3桁の箇所を探します。
preg_match関数では見つかった場合には「1」が返ってきます。
見つからなかった場合には「0」が返ってきて、失敗した場合にはfalseが返ってきます。
if文で、直接$result変数を入れて、判定しています。
今回は数値3桁を含むので、「数値3桁が含まれます!」を出力して処理が終了します。
コメント