PHPのsubstr関数で文字列の一部を取得する方法【初心者向け】

プログラミング初心者向けにPHPのsubstr関数で文字列の一部を取得する方法について解説しています。文字列の中から一部を取得する方法、全角の文字を取得する方法について実際にソースコードを書きながら説明しているので、ぜひご覧ください。

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

substr関数を使って文字列の一部を取得する方法について解説していきます。

サンプルも多く紹介しているので、ぜひ自分でも書いてみて理解していきましょう。

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

 

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

今回の記事の内容は動画でもご覧いただけます。
テキストよりも動画の方が理解しやすいという場合はぜひご覧ください。

 

substr関数とは

substr関数とは、指定した文字列から、一部の文字列を取得する関数です。

たとえば、「a」から始まり「h」で終わる「abcdefgh」のような文字列データがあったとします。この場合、「a」の位置は0番目、「h」の位置は8番目となります。

substr関数を使って、3番目から2文字分の文字列を取得したい場合、

substr('abcdefgh',3,2)

のように指定して実行すると、文字列「de」が、戻り値として返されます。

 

大石ゆかり

田島メンター!一部だけ表示して、続きは・・・の形にしたいんですが、文章の一部を切り取る方法はないのでしょうか?

田島悠介

今回紹介する、substrのような文字列の一部を返す関数がいいね。

大石ゆかり

日本語でも大丈夫ですか?

田島悠介

日本語は1バイトじゃないからね。mb_substrという関数もあるんだ。さっそくsubstrから書き方を見てみよう!

 

substr()の書き方

書式

substr (引数1、引数2、引数3)

 

説明

引数1:文字列(string)
引数2:開始文字位置(int)    0からの開始となります。
引数3:取得したい文字バイト数(int)

 

戻り値

指定した位置の文字列

 

注意事項

  • 引数2で指定した開始文字位置は、0始まりとなりますので間違えないようにしてください。
  • 引数3の文字数は、バイト数での指定となります。半角英数字であれば、1文字1バイトですので、バイト数=文字数なります。
  • 漢字やひらがななどの全角文字は、1文字2バイトとなります。文字数=バイト数となりませんのでご注意ください。
  • 開始文字位置をマイナスで指定することも可能です、この場合、文字列の最後の位置から、先頭に向かって何文字目かという意味になります。

 

使用例

(1)基本的な使い方

引数1に「abcdefgh」を指定しています。

引数2に0を指定すると最初の文字「a」、2を指定すると「c」が指定されます。

引数3に1を指定すると1文字、3を指定すると3文字取得されます。

substr('abcdefgh', 0, 1)  実行結果:a
substr('abcdefgh', 2, 3)  実行結果:cde

 

(2)文字バイト数を省略した場合

引数1に処理元になる文字列「abcdefgh」を指定します。

引数2には開始位置を意味する「4」を指定します。

引数3は省略されているため、文字列の最後の位置まで取得されます。

substr('abcdefgh', 4) 実行結果:efgh

 

 

(3)開始文字位置をマイナスで指定した場合

開始文字位置をマイナスで指定すると、開始文字位置を後ろから数えて何番目という意味になります。

substr('abcdefgh', -2, 1) 実行結果:g
substr('abcdefgh', -4) 実行結果:efgh

 

(4)全角の文字列を指定した場合

substr関数の引数説明で、取得したい文字バイト数という説明があったと思います。

今回、引数3の数値が8となっています。

「abc123」などの半角文字列は1文字が1バイトという単位のため、表示文字の数をそのまま指定すればよいです。

これに対して、「あいうえお」などの全角文字列は、1文字が2バイトで計算されます。

そのため、「おはよう」という4文字分取得するためには8バイトと言う意味の8を、引数3に指定します。

substr('おはようございます。', 0, 8) 実行結果:◆◆◆◆

 

全角文字列を指定する場合、環境によっては文字化けします。

そのため、substr関数ではなく、mb_substr関数を利用する方が良いです。

mb_substr関数の利用方法については後ほどご説明します。

 

(5)文字列の長さが開始文字位置より少ない場合

文字列の長さが開始文字列位置より少ない数の場合はfalseが返されます。

substr('ab', 4) 実行結果:false

 

 

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

実際にsubstr関数を使ったプログラムを書いてみよう。

それでは、実際にsubstr関数を使用して、簡単なサンプルプログラムを作成してみましょう。

1. 文字列を取得する。

[サンプルプログラム]

“abcdefgh”という文字列から文字の位置とバイト数を指定して、文字を取得します。

<?php
  $str1 = 'abcdefgh';
  $substr1 = substr($str1, 0, 1);
  $substr2 = substr($str1, 2, 3);
  $substr3 = substr($str1, 4);
  $substr4 = substr($str1, -2, 1);
  $substr5 = substr($str1, -4);
  print('文字列:'.$str1.' の0バイト目から1バイトを取得する。戻り値:'.$substr1.'<br>');
  print('文字列:'.$str1.' の2バイト目から3バイトを取得する。戻り値:'.$substr2.'<br>');
  print('文字列:'.$str1.' 4バイト目から最後までを取得する。戻り値:'.$substr3.'<br>');
  print('文字列:'.$str1.' の-2バイト目から1バイトを取得する。戻り値:'.$substr4.'<br>');
  print('文字列:'.$str1.' の-4バイト目から最後までを取得する。戻り値:'.$substr5.'<br>');
?>

 

[実行結果]

文字列:abcdefgh の0バイト目から1バイトを取得する。戻り値:a
文字列:abcdefgh の2バイト目から3バイトを取得する。戻り値:cde
文字列:abcdefgh 4バイト目から最後までを取得する。戻り値:efgh
文字列:abcdefgh の-2バイト目から1バイトを取得する。戻り値:g
文字列:abcdefgh の-4バイト目から最後までを取得する。戻り値:efgh

 

2.全角の文字列を取得する。

[サンプルプログラム]

「おはようございます」という全角文字列から、文字の位置とバイト数を指定して文字を取得します。

このケースでは、バイト数を指定するsubstr関数と、文字数を指定するmb_substr関数の実行結果の違いを見てみました。全角をあつかうような文字列操作では、文字数を指定するmb_substr関数を使用することをお奨めします。

substr関数で実行したところ、実行結果に文字化けが生じてしまいました。

<?php
  $str2 = 'おはようございます。';
  $substr4 = substr($str2, 0, 8);
  $substr5 = mb_substr($str2, 0, 4);
  print('substrを使用した場合 <br>');
  print('文字列:'.$str2.' の0バイト目から8バイトを取得する。戻り値:'.$substr4.'<br>');
  print('mb_substrを使用した場合 <br>');
  print('文字列:'.$str2.' の0文字目からから4文字を取得する。戻り値:'.$substr5.'<br>');
?>

 

[実行結果]

substrを使用した場合

文字列:おはようございます。 の0バイト目から8バイトを取得する。戻り値:おは□□

mb_substrを使用した場合

文字列:おはようございます。 の0文字目からから4文字を取得する。戻り値:おはよう

 

おわりに

substr関数のように、文字列を操作する関数で、全角文字や半角カナを扱う場合は注意が必要ですね。

mb_substr関数のように、文字数をバイト数ではなく、文字数そのもので扱うことが出来る関数があれば、そちらを使用したほうがよさそうです。ぜひ一度、試してみてください。

 

大石ゆかり

substrを日本語に使うと文字化けしてますね。

田島悠介

日本語は2バイトだったりするので、途中で分割すると何の文字かわからなくなるんだよね。

大石ゆかり

substrってマイナスの値も使えるですね。何か難しいことに使用されてそう。

田島悠介

とりあえずは、文字列の一部を切り出せる関数があるって覚えるといいよ。使い方の詳細は、その都度調べるのがいいね。

 

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

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

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

 

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

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

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

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

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

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

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