文字列から「先頭の3文字だけ」「後ろから5文字」「途中の一部分」を取り出したい——そんなときに使うのが PHP の substr() です。さらに日本語のようなマルチバイト文字を正しく数えて切り出すには mb_substr() を使います。この記事では、開始位置や長さの指定方法、マイナスを使った末尾からの切り出し、substr() と mb_substr() の使い分け、そして文字数で省略表示を作る実践例まで、初心者の方にも分かるように解説します。
目次
substr は文字列の一部を取り出す関数
substr() は、文字列の指定した位置から指定した長さ分を切り出して返す関数です。基本の書き方は次のとおりで、引数は2つまたは3つ渡します。
<?php
$text = "Hello, World";
// 7文字目(0から数えて7)以降をすべて取り出す
echo substr($text, 7); // World
// 0文字目から5文字分だけ取り出す
echo substr($text, 0, 5); // Hello
ポイントは、位置の数え方が0から始まることです。1文字目は 0、2文字目は 1……と数えます。第3引数(長さ)を省略すると、開始位置から文字列の最後までをすべて取り出します。
引数の意味(開始位置と長さ)
3つの引数がそれぞれ何を表すかを整理します。開始位置・長さのどちらにもマイナスが使えるのが特徴です。
| 引数 | 意味 |
|---|---|
第1引数 $string | 元の文字列 |
第2引数 $offset | 開始位置(0始まり)。マイナスなら末尾からの位置 |
第3引数 $length | 取り出す長さ。省略すると最後まで。マイナスなら末尾から何文字を残すか |
開始位置にマイナスを使う(末尾から数える)
第2引数にマイナスを渡すと、文字列の末尾から数えた位置が開始点になります。ファイルの拡張子のように「後ろの数文字」を取り出したいときに便利です。
<?php
$file = "report.pdf";
// 末尾から3文字を取り出す
echo substr($file, -3); // pdf
// 末尾から3文字目を起点に、そこから1文字
echo substr($file, -3, 1); // p
長さにマイナスを使う(末尾を削る)
第3引数にマイナスを渡すと、「末尾から何文字を残して、その手前まで」を取り出します。末尾の決まった文字を取り除きたいときに使えます。
<?php
$file = "report.pdf";
// 末尾4文字(.pdf)を残さず、その手前までを取り出す
echo substr($file, 0, -4); // report
日本語には mb_substr を使う
substr() は文字列をバイト単位で扱います。半角英数字は1文字=1バイトなので問題ありませんが、UTF-8 の日本語は1文字が3バイト程度あるため、substr() で切ると文字の途中で分断され、文字化けの原因になります。
<?php
$text = "こんにちは世界";
// substr は文字の途中で切れて文字化けする
echo substr($text, 0, 5); // こ�(壊れる)
// mb_substr は「文字」単位で数えるので正しい
echo mb_substr($text, 0, 3); // こんに
mb_substr() は引数の意味も使い方も substr() とほぼ同じで、位置と長さを文字単位で扱う点だけが違います。日本語を含む可能性がある文字列を切り出すときは、原則 mb_substr() を使うと覚えておけば安全です。第4引数で文字コード(例: "UTF-8")を明示することもできます。
| 関数 | 数える単位 | 使いどころ |
|---|---|---|
substr() | バイト | 半角英数字だけの文字列(拡張子・ID など) |
mb_substr() | 文字 | 日本語など全角を含む可能性がある文字列 |
実践例:長い文章を「…」で省略する
記事の一覧などで、本文の冒頭だけを表示して残りを「…」で省略したい場面はよくあります。mb_strlen() で文字数を調べ、一定の長さを超えていたら mb_substr() で先頭だけ取り出す、という組み合わせで実現できます。
<?php
function truncate($text, $limit = 20) {
// 指定文字数以下ならそのまま返す
if (mb_strlen($text) <= $limit) {
return $text;
}
// 先頭 $limit 文字だけ取り出して「…」を付ける
return mb_substr($text, 0, $limit) . "…";
}
echo truncate("PHPで文字列を扱う方法を初心者向けに解説します", 10);
// PHPで文字列を扱う方法…
このように「文字数を測る mb_strlen()」と「切り出す mb_substr()」はセットで使うことが多い関数です。どちらも文字単位なので、日本語でも崩れずに省略表示が作れます。
思った文字が取り出せないとき
1文字ずれるときは0始まりを思い出す
「3文字目から取り出したい」のに1文字ずれる、という間違いは、開始位置を 3 と書いてしまうのが原因です。位置は0から数えるため、3文字目を起点にするなら第2引数は 2 です。最初の1文字は 0、と意識すると間違えにくくなります。
日本語が文字化けするときは mb_ を使う
切り出した日本語が「�」のように壊れるときは、substr() を使っているのが原因です。mb_substr() に置き換えれば文字単位で処理され、化けなくなります。同様に文字数を数える場面でも、strlen() ではなく mb_strlen() を使ってください。
範囲外を指定すると空文字になる
開始位置が文字列の長さを超えている場合、substr() は空文字("")を返します。エラーにはならないため、「何も表示されない」ときは開始位置が大きすぎないかを確認しましょう。元の文字列が想定より短いケースもあるので、必要なら mb_strlen() で長さを先に確かめると確実です。
まとめ
substr() と mb_substr() は、文字列処理でとてもよく使う関数です。要点を振り返ります。
substr($str, 開始位置, 長さ)で一部を取り出す。位置は0始まり。- 開始位置のマイナスは「末尾から」、長さのマイナスは「末尾を削る」。
- 長さを省略すると開始位置から最後まで取り出す。
- 日本語を含むなら
mb_substr()。substr()はバイト単位で文字化けする。 - 文字数は
mb_strlen()で測り、省略表示などに組み合わせる。
まずは mb_substr() を基本に使うと、英数字でも日本語でも安全に扱えます。マイナス指定の挙動に慣れると、末尾の処理もすっきり書けるようになります。