こんにちはフロントエンドエンジニアのまさにょんです!
今回は、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!
神聖グンマー帝国の逆襲🔥
神聖グンマー帝国の科学は、世界一ぃぃぃぃぃぃ!!!!!