[PHP] substr()およびmb_substr()の挙動

公開

スポンサーリンク

substr()およびmb_substr()は文字列の一部を取り出す関数です。両者とも同じ機能を持ちますが、2バイト文字を扱う場合はmb_substr()の方を使います。

基本的な使い方

第1引数に文字列、第2引数に取り出し開始位置を指定します。1文字目は0番目となります。

$str = "hello world !!";
echo substr( $str, 3 );// lo world !!

第2引数に3を指定すると4文字目から文字列の最後までが取り出されました。

取り出し文字数の指定

第3引数に、取り出し文字数を指定することができます。

echo substr( $str, 6, 5 );// world

7文字目のwから5文字が取り出されました。

後ろから指定

第2引数の取り出し開始位置をマイナスにすると、切り取り開始位置を後ろから数えます。この場合、一番後ろの文字を-1と数えます。

echo substr( $str, -8 );// world !!
echo substr( $str, -8, 5 );// world

取り出し文字数に負の数を指定した場合

第3引数に負の数を与えた場合、取り出し文字数ではなく取り出し終了位置として機能します。

echo substr( $str, 0, -3 );// hello world

-3を指定したことで、後ろから3文字目の1文字手前までが取り出されました。

取り出し開始位置が文字数をオーバー

第2引数に文字数より大きい数を与えるとfalseとなります。

$a = substr( $str, 20 );
var_dump( $a );// bool(false)

従って、取り出し開始位置が文字列の途中からとなる場合、あらかじめstrlen()またはmb_strlen()を使い字数を調べてから処理しなければなりません。

一方、文字数より大きな負の数を与えた場合はfalseとはならず1文字目から取り出されます。

echo substr( $str, -50 );// hello world !!
echo substr( $str, -50, 5 );// hello

切り取り文字数が文字列終端を超えた場合

切り取り文字数が文字列の終端をオーバーした場合、切り取り開始位置から最後までを取り出します。

mb_substr()は第4引数にエンコーディングを指定する

mb_substr()を使う場合、第4引数にエンコーディングを指定します。省略した場合、内部エンコーディングによっては文字化けが発生するか、想定と異なる文字列が返ってくる場合があります。

$str = "あめんぼあかいなあいうえお、かきのきくりのきかきくけこ";
//エンコーディング指定なし
echo mb_substr( $str, 0, 20 );// あめんぼあかい

//エンコーディング指定あり
echo mb_substr( $str, 0, 20, 'utf-8' );// あめんぼあかいなあいうえお、かきのきくり

スポンサーリンク


Comment