icon
Let's create! WordPressサイト制作とメンテ/エラー対応から、PHP/CSS/javascriptプログラミング、動画・音・イラスト等制作まで扱うコラム

【PHP】str_containsで、$_SERVER[‘SCRIPT_NAME’]内の文字列をチェックして、ページ内容を分岐させる

更新: 2024/09/03 2521文字

今回は、PHP8から追加されたファンクション(str_contains)を使って、指定された部分文字列が含まれるかチェックを行ってみます。管理人も、この記事執筆時点で作っていたアプリケーションで、ページ内容分岐に使ってみました。さっそく内容を確認してみましょう。

PHPの文字列含まれるか判定~以前のバージョンと8以降

以前のPHPでは、strposや正規表現を使った

PHP4~7だと『strpos』を使うことが多かったかなと思います。管理人もPHP学習し始めの頃はお世話になりました。

$haystack = 'abc';
$needle = 'a';
$pos = strpos($haystack, $needle);
if ($pos === false) {
  echo '文字列$needleは、文字列$haystackの中で見つかりませんでした';
} else {
  echo '見つかりました';
}

ただしこのファンクション、『===のように型も比較しないとまずい』という点がありました。見つかった位置が始めだと『0』が来るんですけど、これが比較のしかたによってはfalseになるからです。見つかったからtrueかなと思ったらfalse

このほか、複雑なパターンでマッチさせる場合は正規表現を使うことが多いです。これは新しいファンクションが増えても使うことが多いと思います。

8から追加の、str_containsファンクションとは?

PHP8から追加された、わりと新しめのファンクションで『指定された部分文字列が、文字列に含まれるか』をチェックします。基本的な使い方は、以下のように、1番目のパラメータ内に2番目のパラメータの文字列が含まれるかを判定して、

if (str_contains($haystack, $needle)) {
  ~処理内容記載~
}

また、PHPマニュアルのサンプルコードを見た感じだと、『空文字列は含まれる判定・アルファベット大文字小文字は区別している』というような挙動が確認できました。

このほか、PHP8で『指定された文字列で終わるか/はじまるか(str_ends_with/str_starts_with)』というのも追加されています。

str_containsで$_SERVER変数(SCRIPT_NAME)判定・ページごとに表示を切り替える

コード例&解説

管理人が途中まで作っている機能なんですけど、想定しているページがindexとarchiveの2つあり、それぞれで表示を切り替える、みたいなのを考えています。$_SERVER(SCRIPT_NAME)でindexかarchiveはわかるので、これをstr_containsで判定します。該当部分は以下のようなコード。self::になっているのは、このクラス内にメソッドがあるからです。

$fname = $_SERVER['SCRIPT_NAME'];
if(str_contains($fname, 'index.php')){
  echo 'indexです<br>';
self::get10Post($dbh);
}

if(str_contains($fname, 'archive.php')){
  echo 'archiveです<br>';
self::getArchivePost($dbh);
}

とりあえず、今の段階では、それぞれ別のメソッド呼んでますよというのが、わかるようにしておきます。

そして、index,archiveそれぞれでインスタンスにして実行します。 (クラス名は変更になる予定です。dbSetupだけでなく記事取得までやりそうなので。)

表示例

では、index,archiveそれぞれで、切り替えが効いているか確認してみましょう。 indexではget10Postというメソッドが呼ばれたのでok($dbhというのはデータベース接続情報を渡す用の変数です。今回は使っていません。)。

archiveもokでしたね~。

あとがき・まとめ

  • 『文字列$haystack内に$needleがあるか』でstrposが使われることが多かったが、0が入る場合の判定に注意
  • PHP8以降では、『文字列$haystack内に$needleがあるか』判定に、str_containsを使うことができる
  • 管理人は$_SERVER内の文字列を判定するのに使ってみたが、パラメータが直感的でわかりやすい

まとめると、こんなところでしょうか。実際つかってみた印象は、strposよりは直感的に使えるなという印象をうけました。


【カテゴリ】- PHP
【タグ】-

関連記事