mb_substrやsubstrを使い日本語等の文字列を取得しよう!~PHP入門~

PHPでプログラミングしている時に、日本語が入った文字列の一部を取得したいと思ったことはありませんか?

PHPでは文字列に対して文字列の一部を取得したり、置換する関数が用意されています。

この記事では、

・substrとは
・substrを使用して文字列の一部を取得する方法
・mb_substrとは
・mb_substrを使用してマルチバイト文字列の一部を取得する方法

という基本的な内容から、

・文字列の一部を置換する方法
・文字列の出現回数を取得する方法

などの文字列操作の関数について解説します。

今回は文字列の一部を取得するsubstr関数、mb_substr関数ついてわかりやすく解説します!

目次

substr関数とは

対象の文字列から、指定した位置からの文字列を取得するにはsubstr関数を使用します。

substr関数の具体的な使い方としては、

「文字列のどの位置から取得したいデータが格納されているか?」

予め決まっている場合に使用する機会が多いと言えます。

substr関数は以下のように記述します。

書き方:

string substr ( string $入力文字列 , int $開始位置 [, int $レングス ] )

引数:
第一引数には入力文字列を指定します。文字列は最低1文字以上を指定する必要があります。

第二引数には開始位置を指定します。例えば3を指定した場合は入力文字列の3文字目から文字列を取得します。

第三引数のレングスを指定した場合は、開始位置から数えてレングス数(文字数)分の文字列を取得することになります。

返り値:
取得した文字列を返します。失敗した場合はFALSEあるいは空文字列を返します。

substr関数の使い方

実際にsubstr関数を使用して文字列の一部を取得してみましょう。

以下にsubstr関数を使用したサンプルを紹介します。

//4番目からの文字列を取得
$result = substr('one two three', 4);
echo $result.'<br>';
 
//文字列の後から数えて9番目からの文字列を取得
$result = substr('one two three', -9);
echo $result.'<br>';
 
//4番目から3文字取得
$result = substr('one two three', 4, 3);
echo $result;

実行結果:

two three
two three
two

上記のようにsubstr関数を使用すれば、指定した開始位置からの文字列を取得したり、開始位置からの文字数分の文字列を取得できます。

また、マイナス値を指定すると文字列の後ろから指定した文字位置からの文字列を取得できます。

substr関数で日付を取得する

年月日「Y-m-d H:i:s」などのデータのフォーマットが予め決まっている場合は、substr関数で「年月日」や「月日」などのデータのみ取得することができます。

$date = "2018-03-01 :12:00:00";
 
//年月日を取得
$result = substr($date, 0, 10);
echo $result.'<br>';
 
//月日を取得
$result = substr($date, 5, 5);
echo $result.'<br>';
 
//時間を取得
$result = substr($date, 12, 8);
echo $result.'<br>';

実行結果:

2018-03-01
03-01
12:00:00

上記のように年月日のみを取得したい場合は、0文字目から10文字目「substr($date, 0, 10)」と指定します。

月日や時間も同じように取得することができます。

mb_substr関数とは

マルチバイト文字列の一部を取得するにはmb_substr関数を使用します。

マルチバイトとは、1文字を複数バイトで表す体系のことを言います。

日本語などのマルチバイト文字は、WindowsのShift_Jisで半角文字は1バイト、全角文字は2バイトとなります。

文字コードUTF-8の場合は、文字バイトが1文字3バイトになります。

mb_substr関数は以下のように記述します。

書き方:

string mb_substr ( string $入力文字列 , int $開始位置 [, int $レングス [, string $encoding ]] )

引数:
第一引数には入力文字列を指定します。文字列は最低1文字以上を指定する必要があります。

第二引数には開始位置を指定します。例えば3を指定した場合は入力文字列の3文字目から文字列を取得します。

第三引数のレングスを指定した場合は、開始位置から数えてレングス数(文字数)分の文字列を取得することになります。

第四引数の$encodingは文字列のエンコーディングを指定します。
日本語を指定する場合はWindowsなら“SJIS”、MacやLinuxなら“EUC-JP”や“UTF-8”を指定します。

返り値:
開始位置及びレングスで指定した文字列の一部を返します。

mb_substr関数の使い方

実際にmb_substr関数を使用して文字列の一部を取得してみましょう。

以下にmb_substr関数を使用したサンプルを紹介します。

//1バイトから3バイト取り出す
$result = substr('ABCDE', 1, 3);
echo $result.'<br>';
 
//4バイトから3バイト取り出す
$result = substr('one two three', 4, 3);
echo $result;

実行結果:

BCD
two

mb_substr関数で日本語を扱う方法

mb_substr関数は2バイト文字(日本語)を取得できるため、日本語の文字列を取得することができます。

日本語を取得するには、第四引数にエンコーディングを指定する必要があります。

エンコーディングを指定しないと文字化けしてしまいます。

以下にmb_substr関数で日本語の文字列の一部を取得するサンプルを紹介します。

//0バイトから3バイト取り出す
$result = mb_substr('侍エンジニアのマンツーマンレッスン', 0, 6,"UTF-8");
echo $result.'<br>';
 
//8バイトから10バイト取り出す
$result = mb_substr('侍エンジニアのマンツーマンレッスン', 8, 10,"UTF-8");
echo $result;

実行結果:

侍エンジニア
マンツーマンレッスン

その他の文字列操作

ここでは、文字列の一部を置換するsubstr_replace関数や文字列の出現回数を取得するsubstr_count関数についても紹介します。

substr_replace関数(文字列の一部を置換)

文字列の一部を置換するにはsubstr_replace関数を使用します。

書き方:

substr_replace( $検索対象文字列 , $置換後文字列 , $置換位置 [, $置換する範囲 ] )

返り値:
置換した結果の文字列を返します。対象の文字列が配列の場合は配列が返されます。

以下にsubstr_replace関数を使用して、指定位置からの文字列を置換する方法を記述します。

$str = 'SamuraiEngineer';
 
//7番目の文字列から'#'に置き換える
$replace = substr_replace($str, '#', 7);
 
echo $replace;

実行結果:

Samurai#

substr_count関数(文字列の出現回数)

文字列の出現回数をカウントするにはsubstr_count関数を使用します。

substr_count関数は以下のように記述します。

書き方:

int substr_count ( string $検索対象文字列 , string $検索文字列 [, int $開始位置 [, int $レングス ]]

引数:
第一引数には検索対象文字列を指定し、第二引数には検索する文字列を指定します。

第三引数には開始位置を指定します。負の数を指定すると文字列の末尾から数えます。

第四引数には文字列の最大長を指定します。

返り値:
ヒットした文字列の出現回数を返します。

以下のサンプルでは、文字列’today is rainy. It is likely to rain tomorrow.’の中に、’rain’がいくつ含まれているか、カウントしています。

$text = 'today is rainy. It is likely to rain tomorrow.';
 
//文字列の中に'rain'が含まれるか
$count =  substr_count($text, 'rain');
echo $count.'<br>';
 
//16文字目からの文字列に'rain'が含まれるか?
$count =  substr_count($text, 'rain', 16);
echo $count.'<br>';
 
//16文字目から+10文字目までの文字列'It is likely'に'rain'が含まれるか?
$count =  substr_count($text, 'rain', 16, 12);
echo $count;

実行結果:

2
1
0

サンプルのように、用途によって第三引数や第四引数を指定することにより、検索対象の範囲を絞り込むことも可能です。

PHPについてもっと知りたい方へ

いかがでしたでしょうか?

PHPは文字列を操作する方法だけでもさまざまな関数を使用できることがわかりましたね!

「PHPについて実はいまいちわかっていない・・・」
「もっとPHPについて詳しく知りたい!」

と思っている方は以下の記事も参考にしてみてください!

まとめ

ここでは文字列の一部を取得する方法や、文字列の一部を置換する方法、文字列の出現回数を取得する方法などについて解説しました。

  • 文字列の一部を取得するにはsubstr関数
  • マルチバイト文字列の一部を取得するにはmb_substr関数
  • 文字列の一部を置換するにはsubstr_replace関数
  • 文字列の出現回数を取得するにはsubstr_count関数

と覚えておきましょう。

実際にこの記事で紹介したように文字列から特定の文字列を取得したり、置換する処理はよく使います。

もし、文字列の一部を取得、置換、出現回数などの方法を忘れてしまったら、この記事を思い出してくださいね!

この記事を書いた人

システムエンジニアとして10年勤務→フリーランスへ。
大規模システム開発からWebアプリ開発まで経験あり。最近ではPythonの機械学習に挑戦中。プログラミング初学者に向けてわかりやすく、ためになるコンテンツ作りを心がけています。

目次