PHPのstrposで文字列が最初に現れる場所を取得する方法【初心者向け】

プログラミング初心者向けにPHPのstrpos関数を使って文字列が最初に現れる場所を取得する方法について解説しています。ある文字列の中に指定の文字列があるかどうか確認するためにも使うことが出来ます。ぜひ参考にしてみてください。

TechAcademyマガジンはオンラインのプログラミングスクールTechAcademy [テックアカデミー]が運営する教育×テクノロジーのWebメディアです。初心者でもすぐ勉強できる記事が2,000以上あります。

phpのstrpos関数を使って文字列が最初に現れる場所を取得する方法について解説しています。

文字列の中に指定の文字列があるかどうか探す上でも便利なので、ぜひ書き方をマスターしておきましょう。

そもそもPHPが何か分からない場合は、先にPHPとはの記事をご覧ください。

 

なお本記事は、TechAcademyのPHPオンライン講座の内容をもとにしています。

 

phpのstrposとは

strpos関数は、文字列内の部分文字列が最初に現れる場所を見つけるために使用します。

文字列の中に指定した文字列が見つかった場合、見つかった位置を0から数値で返します。

見つからなかった場合は、論理値FALSEを返します。

動作の説明は難しいですが、ある文字列の中に指定の文字列があるかどうか確認するためにも使うことが出来ます。

ある文字列の中にある文字列があるかどうか、というのは他の関数でもありますが、実行速度はstrposの方が速いです。preg_matchの約2倍、ereg の約5倍の速さになります。

 

大石ゆかり

文字列の中に、ある文字列があるかどうか、というのはstrpos関数を使うんですね?

田島悠介

そうなんだ。ただ、少し特殊な部分があるんだよね。書き方を見てみよう!

 

phpのstrposの書き方

strpos ( 検索対象文字列 , 検索文字列 [, 文字列の中での検索開始位置] )

検索対象文字列に対して、検索文字列があるかどうかを判定して、あればその場所を数値で返します。

なければFALSEを返します。オプションを指定すると、検索するときの開始位置を変更することができます。

 

テックアカデミーという文字列の中にアカデミーという単語があるか検索

<?php
  echo strpos("テックアカデミー","アカデミー");
?>

出力結果は、「9」という数字が表示されます。これはutf-8の文字コードにおいて9バイト目にアカデミーとして始まる単語があるという意味になります。

検索文字列を、アカデミーからテックに変更すると数字の0が返ってきます。

phpでは0は書き方によっては、FALSEとして扱われてしまうので注意が必要です。

条件式では!==や===を使う必要があります。

<?php
  $a = "テックアカデミー";
  if(strpos($a,"テック")){
    echo "テックという文字がありました";
  }
  echo strpos($a,"テック");
?>

上記は、テックアカデミーという文字列の中に、テックという文字が含まれているかどうかを調べています。
含まれているので、テックという文字がありました、と表示されるはずなのですが、表示されません。

テックという文字列は、$aの中の最初の部分から始まっているので、strposが返す値は「0」になります。
phpでは通常0はfalseとして扱われてしまいます。

条件式の中を、false !== strpos($a,”テック”)にすることで、想定した通りの動作になります。
===や!==は型までチェックしてくれます。

 

大石ゆかり

文字列の中に文字があった場合、文字が現れる位置を返す。ただし、最初にあった場合は、0が返ってくるので、falseになってしまうってことですか?

田島悠介

その通り!データの型があるんだよね。データの型までしっかり調べる場合には、===や!==を使わなければならないんだ。わかりづらかったら、==や!=は使わないで、===と!==を使うってことにしてもいいね。

大石ゆかり

わかりました!

 

offset(オフセット)について

offsetの基本的な文法で、[文字列の中での検索開始位置]という指定部分がありました。

strpos ( 検索対象文字列 , 検索文字列 [, 文字列の中での検索開始位置] )

この部分の指定をoffset(オフセット)と呼び、文字列の中での検索開始位置を指定します。

なお、offset(オフセット)の指定は必須ではありません。

また、PHPバージョン7.1.0からは、offset(オフセット)の値を負の値(マイナス値)で指定することができるようになりました。

負の値(マイナス値)で指定することで、[後ろから数えた場合の文字列の中での検索開始位置]を指定することができます。

offset(オフセット)の具体的な実装については、strposのサンプルプログラムで利用していきます。

 

[PR] PHPのプログラミングで挫折しない学習方法を動画で公開中

strposのサンプルプログラム

strposは文字列が最初に現れる場所を返してくれますが、では2番目や3番目となるとどうでしょうか。

例えば、techacademy-techacademyという文字列があって、2つ目のtechacademyの場所を知りたい場合です。

2番目あるいは3番目の出現位置を知りたい場合どうしたらいいでしょうか。

strposのオプションには、検索開始位置を指定できます。

1つ目のtechacademyが見つかったら、その位置を記録しておき、techacademy分の文字列の長さを足せば、2つ目のtechacademyを検索するべき場所が決定します。

<?php
  function strpos2($str, $needle, $n = 0) {
    $offset = 0;
    $len = strlen($needle);
    while ($n-- >= 0 && ($pos = strpos($str, $needle, $offset)) !== false) {
      $offset = $pos + $len;
    }
    return $pos;
  }
  var_dump(strpos2("techacademy is programing site. let's join techacademy", 'techacademy', 1));
?>

strpos2というユーザー定義関数を作成しました。strposが使われるのは、strpos2の中です。strpos2はstrposのように装いますが、実際には$nは何回目の文字であるかを意味しています。最初に現れるtechacademyを調べたいなら$n=0にします。1なら2番目、2なら3番目になります。

$offsetという変数を用意します。これは、あとで値が変更されるからです。

$lenに検索文字列であるtechacademyの文字のバイト数を代入しておきます。

最初に見つかったtechacademyの位置+techacademyのバイト数が次に検索を開始すべき位置だからです。

$posがfalseになった場合(もう検索したい文字列がない場合)はwhileを抜けます。

$offsetに、見つかった位置と検索文字列の長さを足しています。

 

おわりに

以上、strpos関数を使って最初に現れる文字列の取得、指定した文字列の確認の方法について解説しました。

PHPだけではなくJavaScriptでも活用できるでしょう。

 

大石ゆかり

これは技巧的なサンプルで、難しいですね。

田島悠介

簡単に考えると、ブラウザとかでページの文字を検索した時に似てるよね。最初にマッチした文字があって、次のがあれば、次のマッチした文字に移動するような。

大石ゆかり

$nの所が、何個目の文字列かどうかの指定ですか?

田島悠介

そうそう。strposは見つかった文字の位置を返すよね。これに検索文字列の長さを加えると、最初に見つかった文字列の後ろを表現できるんだ。これが重要かな。strposは、こういった技巧的な使い方も出来るんだよね。

 

また、PHPを勉強していて、

  • もっと効率的に勉強したい
  • 誰かに聞きながら学びたい
  • 自分でWebサービスを作りたい

と思ったことはないでしょうか。

 

そんな方のために、TechAcademyではオンラインブートキャンプPHP/Laravelコースを提供しています。

現役エンジニアがパーソナルメンターとして受講生に1人ずつつき、マンツーマンのメンタリングで学習をサポートし、最短4週間でオリジナルWebサービスを開発することが可能です。

独学に限界を感じている場合はご検討ください。

 

この記事を監修してくれた方

中本賢吾(なかもとけんご)
アジマッチ有限会社 代表取締役社長

開発実績:PHPフレームワークを利用した会員制SNS・ネットショップ構築、AWSや専用サーバー下でLinuxを使用したセキュアな環境構築、人工知能を利用したシステム開発、店舗検索スマホアプリ開発など。

その他にも地域の職業プログラマー育成活動を行い、2018年には小学生がUnityで開発したオリジナルAndroidアプリをGooglePlayでリリース。ゲームで遊ぶより作ろうぜ!を合言葉に、小学生でも起業できる技術力を育成可能で有ることを証明し続けている。