PHPで文字列を含むか検索する5つの方法!

PHP

PHPで特定の文字列を含むか検索する方法について書いています。
下記の関数を使って、特定文字列が文字列に含まれるか検索することが可能です。

・strpos関数
・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桁が含まれます!」を出力して処理が終了します。

コメント

タイトルとURLをコピーしました