はじめに
実装していると、下記のような文字列を切り出して使用したいケースが発生します。
- URLから特定のパラメータを抽出する
- ユーザーからの入力から特定のキーワードを検出する
- ファイル名や拡張子を取得する
PHPには、このようなケースで利用できる関数がいくつか用意されていますが、本記事ではsubstr関数とmb_substr関数について解説します。
この2つの関数の違いを理解して、上記のようなケースに対応できるようにしていきましょう。
substr関数
基本的な使い方
substr関数の基本構文は以下の通りです。
substr(string $対象の文字列, int $開始位置(0から始まる), int $文字数(省略時は文字列の最後まで) = null): string
では実際に具体例を見てみましょう。
こちらのコードは、郵便番号の前3文字 + ハイフン以降の文字列を取得する目的で書かれたコードです。
$postcode = "285-0810";
$result = substr($postcode, 4);
echo $result;
「285-0810」という文字列に対して、先頭から4文字目を開始位置にセットし、以降の文字列を取得します。
よって出力結果は、
0810
となります。
次に第3引数の文字数を指定してみましょう。
こちらのコードは、郵便番号の前3文字を取得する目的で書かれたコードです。
開始位置に0、文字数に3が指定されています。
$postcode = "285-0810";
$result = substr($postcode, 0, 3);
echo $result;
出力結果は、
285
となります。
負の値を指定する
負の値を指定することもでき、負の値を指定した場合は、文字列の後ろから数えます。
$postcode = "285-0810";
$result = substr($postcode, -3);
echo $result;
後ろから3文字目を開始位置とするので出力結果は、
810
となります。
注意点
substr関数はシンプルで扱いやすい反面、マルチバイト文字(日本語など2バイト以上の文字)には対応していません。
マルチバイト文字が含まれる可能性がある場合は、mb_substr関数を使うようにしましょう。
mb_substr関数
mb_substr関数は、substr関数のマルチバイト文字対応版です。
mb_substr関数の基本構文は以下の通りです。
mb_substr(string $対象の文字列, int $開始位置(0から始まる), int $文字数(省略時は文字列の最後まで) = null, string $文字エンコーディング(省略時可能) = null): string
mb_substr関数は、substr関数とほぼ同じ使い方ですが、$encodingパラメータで文字エンコーディングを指定できる点が異なります。
$string = "あいうえお";
$result = mb_substr($string, 1, 3, "UTF-8");
echo $result;
上記のように第4引数に文字エンコーディング(UTF-8)を指定することで、文字化けせずに日本語の文字列の一部を取得することができました。
一方で、substr関数に比べてやや処理速度が遅くなる場合があるので、うまく使い分けするように心がけましょう。
終わりに
いかがでしたでしょうか?
今回はPHPで文字列を切り出す方法として、substr関数とmb_substr関数の2つを紹介しました。
改めて整理すると、
- substr関数:シンプルで高速ですが、マルチバイト文字に対応していません。
- mb_substr関数:マルチバイト文字に対応していますが、substr関数に比べて処理速度が遅くなる場合があります。
という特徴があります。
それぞれの関数の特徴を理解し、状況に応じて使い分けていきましょう。