【PHP】文字列の一致や、文字列を含むかどうかを判定

この記事は2010年に書いたものを書き直しました。

こんにちは。とみっちです。

PHPで検索対象の文字列に、特定の文字列が含まれるかどうかなどをチェックするための書き方を紹介します。

「strstr」と「stristr」

まずはPHPマニュアルで「strstr」を確認してみましょう。

参考記事
php.net - strstr

続いてこちらは「stristr」になります。

参考記事
php.net - stristr

書き方はどちらもこのようになります。

strstr( A, B )
stristr( A, B )
文字列Aにおいて文字列Bが最初に見つかった位置から最後までの文字列を返す。

strstr()は文字列の大文字小文字を区別し、stristr()は文字列の大文字小文字を区別しません。

↑パッと見分かりづらいんですけど、関数名に「i」が入っている場合と入っていない場合で、挙動が違ってくるので注意しましょう!

<?php
 $url = 'http://example.com/shop/item/3';

 if (strstr($url, '/shop/item')) {
  echo "URLに「/shop/item」が含まれています。";
 } else {
  echo "URLに「/shop/item」が含まれていません。";
 }

 echo "<br>";

 var_dump(strstr($url, '/shop/item'));

$_SERVER["REQUEST_URI"] でドメイン名以降のURL文字列を取得することが可能です。

「strstr」関数のサンプル実行結果

URLに「/shop/item」が含まれています。
string(12) "/shop/item/3"

この関数は、見つかった文字列部分Bから最後までを結果として返すので、

echo strstr($url, '/shop/item');

とすると、「/shop/item/3」が表示されます。

「/shop/item」だけではなく、一致した文字列以降が返却されることに注意しましょうね。

「strpos」

参考記事
php.net - strpos
strpos( A, B )
文字列Aの中で、Bが最初に現れる位置を探す。
<?php
  $url = 'http://example.com/shop/item/3';

  if (strpos($url, '/shop/item') !== false) {
    echo "URLに「/shop/item」が含まれています。";
  } else {
    echo "URLに「/shop/item」が含まれていません。";
  }
  echo "<br>";

  $str = '進撃の巨人';

  var_dump(strpos($str, '進撃'));
  echo "<br>";

  if(strpos($str, '進撃') !== false) {
    echo '駆逐してやる!';
  }

「strpos」関数のサンプル実行結果

URLに「/shop/item」が含まれています。
int(0)
駆逐してやる!

strposは該当する文字列が見つからなかった場合にfalseを返すのですが、先頭に該当する文字列があった場合に0を返すので注意しましょう。

型までチェックする必要があるため、判定には「=== false」もしくは「!== false」を使いましょう。

先頭一致の場合に判定できないので、trueでの判定は使わないでください。

「preg_match」

reg_match( A, B )
文字列Bから正規表現パターンAにより、文字列のマッチングを行う。
<?php
  $string = "PHPは便利だ!";

  if (preg_match("/PHP/", $string)) {
      echo "「PHP」が含まれています。";
  } else {
      echo "「PHP」が含まれていません。";
  }

「preg_match」関数のサンプル実行結果1

「PHP」が含まれています。

preg_match関数だと正規表現が使えるので、例えば特定の文字列から開始するかどうかといった確認(先頭一致)も「^」といった記号を使うことで可能です。

<?php
  $string = "PHPをそんなにディスらないで。";

  if (preg_match("/^PHP/", $string)) {
    echo "検索文字列の先頭は「PHP」です。";
  } else {
    echo "検索文字列の先頭は「PHP」ではありません。";
  }

「preg_match」関数のサンプル実行結果2

検索文字列の先頭は「PHP」です。

※正規表現パターンAを「/^[0-9]+$/」とすれば文字列Bが全て半角数字かどうか調べるといった使い方も可能です。

正規表現が使えると便利!

特定の文字列が他の文字列内に含まれているかどうかを調べるためだけに「preg_match」関数を使うのは避けたいところ。「strpos」関数、次いで「strstr」関数を使うほうが速い。

注意事項

preg_match関数は上記の「strstr/stristr」、「strpos」関数よりも低速でメモリ消費が多いので注意しましょう。

実行速度が速い順に、

  1. strpos
  2. strstr/stristr
  3. preg_match

となります。

できるだけ高速に処理を行いたい場合は「strpos」関数がオススメです。
 

以上、「PHPで文字列の一致や、文字列を含むかどうかを判定」する方法でした!

ABOUTこの記事を書いた人

とみっち

数年前までバンド活動してました。また活動するよ!現在はブログを運営して暮らしています。サウンドクリエイター、Webクリエイター。息子は5歳。長野市出身。埼玉県内を転々(東松山市→志木市→川越市)とし、現在は本庄市に住み法人化しました。6人で会社やってます。 【興味】音/Web/車(GolfV GTI等)/田舎/旅/酒 ※自然の音からデスメタルまで聴きます。 @tomicci 詳しいプロフィール 【主な運営サイト】 ザ・サイベース おと風景