PHPで文字列の一部分を抽出する:substr(), mb_substr()

PHPで文字列の一部分を抽出するsubstr() 関数と、日本語などのマルチバイト対応の mb_substr() 関数について説明します。

substr 関数

substr 関数の書式は以下の通りです。

substr( 文字列, 開始位置, [文字数] )

substr 関数は戻り値として抽出した文字列を返します。第1引数には抽出の対象となる文字列を指定します。また、第2引数には抽出の開始する位置を、第3引数には開始位置から抽出する文字数を指定します。開始位置は1文字目を0から数えるので注意してください。

第2引数に負の値を指定した場合は、対象文字列の末尾から抽出が開始されまた。また、第3引数に負の値を指定した場合は、指定した値分だけ抽出し末尾から文字列を省略します。

第3引数は省略でき、省略した場合は第2引数となる開始位置から末尾までの文字列を抽出します。

以下は substr 関数を使用したサンプルコードです。

<?php
echo substr( "orange", 2 );      // 実行結果: ange
echo substr( "orange", 6);       // 実行結果: false
echo substr( "orange", -2 );     // 実行結果: ge
echo substr( "orange", -10 );    // 実行結果: orange
echo substr( "orange", 2 , 2 );  // 実行結果: ab
echo substr( "orange", -3 ,-1 ); // 実行結果: ng
echo substr( "orange", 4, -4);   // 実行結果: false
?>

指定した開始位置が対象文字列の文字数を超えている場合や、文字列を取得できなかった場合などは false を返します。

もし sbtstr 関数に日本語を指定した場合は正確な文字数分の抽出ができなかったり、文字化けが発生してしまったりするので、日本語などのマルチバイト文字を扱う場合は mb_substr 関数を使いましょう。

mb_substr 関数

基本的な使い方は substr 関数と同じですが、mb_substr 関数はマルチバイト対応になっています。

ms_substr 関数の書式は以下の通りです。

mb_substr( 文字列, 開始位置 [,文字数 [,エンコーディング]] )

mb_substr 関数は戻り値として抽出した文字列を返します。第1引数には抽出の対象となる文字列を指定します。また、第2引数には抽出の開始する位置を、第3引数には開始位置から抽出する最大文字数を指定します。開始位置は substr 関数と同様に1文字目を0から数えます。第4引数は文字エンコーディングを指定します。

第2引数に負の値を指定した場合は、対象文字列の末尾から抽出が開始されまた。また、第3引数に負の値を指定した場合は、指定した値分だけ抽出し末尾から文字列を省略します。

第3引数は省略でき、省略した場合は第2引数となる開始位置から末尾までの文字列を抽出します。

第4引数も省略できます。引数を省略した場合は内部エンコーディングが使用されます。

以下は mb_substr 関数を使用したサンプルコードです。

<?php 
echo mb_substr('グレープフルーツ', 0, 4, "UTF-8");   // 実行結果: グレープ 
echo mb_substr('グレープフルーツ', 4, 6, "UTF-8");   // 実行結果: フルーツ 
echo mb_substr('グレープフルーツ', -4, 4, "UTF-8");  // 実行結果: フルーツ 
echo mb_substr('orange', 0, 2, "UTF-8");         // 実行結果: or 
?>

対象文字列に日本語を指定した場合も、文字化けが発生することもなく取得できています。

substr と mb_substr の違い

扱う文字のバイト数が違います。substr は1バイト文字、mb_substr は2バイト文字を扱います。 substr で日本語の文字列から文字を扱うとき文字化けします。mb_substr でも日本語の文字列から文字を扱う時、文字エンコーディングを指定しないと文字化けします。mb_substr は半角文字も全角文字も、1文字として認識します。


イベント

2017/10/06(金)
UX School(全10回)