PHPで特定の文字列が含まれているかを調べる・確認する方法(strpos, mb_strpos, preg_match)

PHP-string-include

こんにちはフロントエンドエンジニアのまさにょんです!

今回は、PHPで特定の文字列が含まれているかを調べる・確認する方法(strpos, mb_strpos, preg_match)について解説していきます。

PHPで特定の文字列が含まれているかを調べる・確認する方法

PHPで特定の文字列が含まれているかを調べる・確認するには、strpos関数かpreg_match関数を使用します。

strpos関数で特定の文字列が含まれているかを調べる

strpos関数で特定の文字列が含まれているかを調べる場合は、strpos(対象文字列, 特定の文字列) といった形で使います。

また、返り値は、該当の文字列があったらその文字列の位置番号(0始まり)であり、該当の文字列がなかったらfalseを返す仕様です。

なので、「 === 」を使った「型も含めた厳密-Check」にしないと想定外の動きになってしまいます。

<?php

$moji_list = ['group@ロボ玉', 'ロボ玉試作1号機', 'ロボ玉試作2号機', 'ロボ玉試作3号機', 'group@猫', '白桃さん', 'ももちゃん'];

foreach ($moji_list as $moji) {

    // 厳密-Checkにしないと、整数の「0」がfalseに変換されてしまいます・・・
    if (strpos($moji, 'group@') === false)  echo 'なし' . "\n";
    else echo 'あり' . "\n";
}

// [ 実行結果 ] 
// あり
// なし
// なし
// なし
// あり
// なし
// なし

strpos関数を使用する際の注意点 (厳密な型Check と マルチバイト文字の場合)

先述のとおり、strpos関数では、「 === 」を使った「型も含めた厳密-Check」にしないと想定外の動きになってしまいます。

このことは、PHP-Manualにも警告として記載があります。

strpos

strpos — 文字列内の部分文字列が最初に現れる場所を見つける

[ 説明 ]

strpos(string $haystack, string $needle, int $offset = 0): int|false

文字列 haystack の中で、 needle が最初に現れる位置を探します。

[ 戻り値 ]

needle が見つかった位置を、 haystack 文字列の先頭 (offset の値とは無関係) からの相対位置で返します。

文字列の開始位置は 0 であり、1 ではないことに注意しましょう。

needle が見つからない場合は false を返します。

[ 警告 ]

この関数は論理値 false を返す可能性がありますが、false として評価される値を返す可能性もあります。

詳細については 論理値の セクションを参照してください。

この関数の返り値を調べるには ===演算子 を 使用してください。

引用元: PHP-Manual:strpos

試しに型まではCheckしない「 == 」を使って先述のコードを実行すると、実行結果がすべて「なし」になります。

<?php

$moji_list = ['group@ロボ玉', 'ロボ玉試作1号機', 'ロボ玉試作2号機', 'ロボ玉試作3号機', 'group@猫', '白桃さん', 'ももちゃん'];

foreach ($moji_list as $moji) {

    // NG-パターン
    if (strpos($moji, 'group@') == false)  echo 'なし' . "\n";
    else echo 'あり' . "\n";
}

// [ 実行結果 ] 
// なし
// なし
// なし
// なし
// なし
// なし
// なし

また、マルチバイト文字列(日本語などの全角系文字)に対する判定を実施する際mb_strpos()を使って判定しましょう。

ちなみに、PHPの組子も関数でmbが接頭辞な関数をよく見ますが、

このmbはマルチバイトの略でmb_strpos()strpos()のマルチバイト対応バージョンという意味です。

preg_match関数で正規表現にマッチするかで調べる

preg_match関数 は、preg_match(正規表現, 対象文字列) で正規表現にマッチするか調べます。

対象文字列が pattern にマッチした場合に 1 を返します。

マッチしなかった場合は 0 を返します。 失敗した場合に false を返します。

<?php

$moji_list = ['group@ロボ玉', 'ロボ玉試作1号機', 'ロボ玉試作2号機', 'ロボ玉試作3号機', 'group@猫', '白桃さん', 'ももちゃん'];

foreach ($moji_list as $moji) {

    if (preg_match('/group@/', $moji))  echo 'あり' . "\n";
    else echo 'なし' . "\n";
}

// [ 実行結果 ] 
// あり
// なし
// なし
// なし
// あり
// なし
// なし

Twitterやってます!Follow Me!

神聖グンマー帝国の逆襲🔥

神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!

PHP / Laravel書籍

参考・引用

  1. PHP-Manual:strpos
  2. PHP-Manual: preg_match
  3. PHP-Manual: mb_strpos

最近の投稿