PHPで文字列を切り出す方法
公開:
PHPで文字列の一部を切り出したい場面は、特定のフォーマットからのデータ抽出や不要な文字の削除など、Webアプリケーション開発で頻繁に発生します。文字列操作でよく使われるのが「substr関数」で、開始位置と長さを指定することによって、目的の部分を簡単に取得できるのが特徴です。
この記事では、PHPで文字列の一部を切り出すための基本的な方法と関数の使い方を詳しく解説していきます。特定の位置からの抽出や末尾から指定する実践的な手順など、すぐに試せるサンプルコード付きで順番に解説していきますので、ぜひ参考にしてください。
PHPで文字列の一部を切り出す方法
PHPで文字列から任意の部分を切り出すには、専用の組み込み関数を利用します。要件に合わせて適切な関数を選ぶのが基本です。
特定の開始位置や文字数を指定して、柔軟な切り出しが可能となります。主な文字列切り出しの手法は、以下の通りです。
- 先頭や指定位置からの切り出し
- 文字列の末尾からの切り出し
これらの方法を理解しておくと実装の幅が広がります。まずは、最も基本となる関数を用いた切り出し方について、確認していきます。
substr関数で位置と長さを指定する
PHPで文字列を切り出す際に最も一般的に使われるのが、substr関数です。第一引数に対象の文字列、第二引数に開始位置、第三引数に切り出す長さを指定します。
文字列 string の、 offset で指定された位置から length バイト分の文字列を返します。
出典:PHP 公式ドキュメント substr
公式ドキュメントが「バイト分」と明記しているとおり、substr関数が数えるのは文字数ではなくバイト数です。半角英数字だけであれば文字数と一致しますが、日本語を含む文字列では意図しない位置で切れるため注意してください。
substr関数の基本的な使い方は、以下の通りです。
$text = "HelloWorld";
$result = substr($text, 0, 5);
echo $result;
上記のコードでは、文字列の先頭から5文字分を切り出して表示しています。開始位置は0からカウントされる仕様です。
第三引数を省略した場合は、開始位置から文字列の最後までがすべて抽出されます。バイト単位で処理されるため、日本語を扱う際には文字化けに注意が必要です。
負のインデックスで末尾から指定する
開始位置にマイナスの数値を指定すると、文字列の末尾から数えた位置を基準に切り出せます。特定フォーマットの拡張子や末尾の数文字だけを取得したい場面で便利です。
負のインデックスを使用して後ろから切り出す方法は、以下の通りです。
$text = "sample_image.jpg";
$result = substr($text, -4);
echo $result;
上記のコードでは、末尾から4文字分を指定することによって「.jpg」という文字列を取得しています。第三引数を指定しなくても、末尾からの位置だけで必要な部分を取り出せる仕組みです。
もし負の開始位置に加えて第三引数にも負の数値を指定した場合、末尾から数えた終了位置までの範囲が切り出されます。柔軟な指定ができるため、用途に応じて使い分けるのが効果的です。
PHPで日本語の文字列を切り出す方法
PHPで日本語を扱う場合、標準の関数では予期せぬ文字化けが発生するリスクがあります。ここでは、マルチバイト文字を安全に切り出すための専用関数の使い方を解説します。
マルチバイト文字の文字化けを防ぐ
日本語などのマルチバイト文字をsubstr()関数で処理すると、バイト単位で分割されるため文字化けの原因です。マルチバイト文字対応の関数を使うのが基本です。
mb_substrやmb_strcutはmbstring拡張機能が提供する関数のため、実行環境で拡張機能が有効になっていないと未定義関数のエラーになります。事前に環境で利用可能か確認しておく必要があります。
以下に、用途に合わせた関数の違いをまとめました。
| 関数名 | 切り出しの基準 | 主な用途 |
|---|---|---|
mb_substr |
文字数 | 画面表示用に文字数を制限したい場合 |
mb_strcut |
バイト数 | データベースのバイト数制限に合わせたい場合 |
このように、文字数で切り出すかバイト数で切り出すかによって、適切な関数が異なります。文字化けを意図的に発生させる悪い例と、その対策となるコードは以下の通りです。
$text = "あいうえお";
// substrでは文字化けする可能性が高い
$bad_result = substr($text, 0, 4);
// マルチバイト対応関数を使うのが安全
$good_result = mb_substr($text, 0, 2);
上記のコードでは、substr()を使うと日本語の途中で分割されてしまいます。日本語を含む文字列を操作する際は、必ずマルチバイト対応関数を選ぶのが推奨されます。
mb_substrで文字数単位に切り出す
mb_substr()関数は、文字数ベースでマルチバイト文字列の一部を取得する関数です。全角文字も1文字としてカウントされるため、直感的に長さを指定できるのが特徴です。
mb_substr()の基本的な使い方を、以下のコードで確認します。
$text = "PHPで文字列を切り出す";
// 0番目から3文字を取得する
$result = mb_substr($text, 0, 3);
echo $result; // 出力結果: PHP
上記のコードでは、開始位置に0、取得したい文字数に3を指定しています。第4引数には文字エンコーディングを指定することも可能で、省略した場合は内部文字エンコーディングが適用される仕組みです。
第4引数を省略する場合は、対象の文字列と内部文字エンコーディング(通常はUTF-8)を一致させておく必要があります。異なるエンコーディングの文字列を扱う際は、第4引数で明示的に指定してください。
mb_strcutでバイト数の上限に合わせる
mb_strcut()関数は、指定したバイト数に基づいて文字列を切り出す関数です。文字の途中で指定バイト数に達した場合は、その文字を含めずに手前で安全にカットしてくれます。
mb_strcut()を使って、バイト数制限に合わせて文字列を切り出すコードは以下の通りです。
$text = "あいうえお";
// 0番目から4バイト分を取得する(UTF-8では「あ」のみ)
$result = mb_strcut($text, 0, 4);
echo $result; // 出力結果: あ
上記のコードでは、UTF-8環境で「あ」が3バイト、「い」が3バイトの合計6バイトのうち、4バイトで指定しているため「あ」だけが返されます。データベースの型が持つバイト数上限に合わせて保存したい場面などで重宝する仕様です。
PHPで特定の区切り文字から切り出す方法
PHPで文字列内に含まれるカンマや空白などを基準に切り出したい場面では、区切り文字での分割処理が有効です。特定の文字を境界にして文字列を分け、それぞれの値を配列として取得できます。
ここでは、explode()関数を使用する方法から、配列から任意の要素を取得する手順までを解説します。
特定の区切り文字で切り出すための主な手順は、以下の通りです。
-
explode()関数で文字列を配列に分割する - 分割後の配列からインデックス番号を指定して取得する
上から順番に処理を記述することによって、CSV形式の行やURLのパスなどから目的の文字列だけを抽出できます。
explode関数で区切り文字ごとに分割する
PHPで特定の区切り文字を基準に文字列を分割するには、explode()関数を使用します。第一引数に区切り文字、第二引数に対象の文字列を指定する仕組みです。
explode()関数の基本的な使い方は、以下の通りです。
$string = "apple,banana,orange";
$result = explode(",", $string);
print_r($result);
上記のコードでは、カンマを区切り文字として文字列を分割しています。分割された文字列は配列として返されるのが特徴です。
explode()関数の主な引数は、以下のように設定します。
| 引数 | 説明 |
|---|---|
| 第一引数 | 区切り文字(カンマや空白など) |
| 第二引数 | 分割の対象となる元の文字列 |
| 第三引数 | 分割数の上限(任意・正負で挙動が異なる) |
不要な分割を避けたい場合は、第三引数を活用すると効率的です。limitに正の値を指定すると、その数までの要素に分割し、最後の要素には残り全体がまとめて含まれます。
負の値を指定した場合は、末尾からその数だけ要素を除外した配列が返される仕様です。まずは正の値を使う基本パターンから覚えるのが安全といえます。
配列から任意の要素を取得する
explode()関数で分割した文字列は配列に格納されるため、インデックス番号を指定して任意の要素を取得できます。最初の要素はインデックス番号0から数える仕様です。
配列から特定の要素を取得するコードは、以下の通りです。
$string = "apple,banana,orange";
$result = explode(",", $string);
// 2番目の要素(banana)を取得
echo $result[1];
上記のコードでは、インデックス番号1を指定して2番目の要素「banana」を取得しています。配列のインデックスは0から始まるため、先頭の要素を取り出したい場合は0を指定してください。
存在しないインデックスを指定した場合、PHP 8.0以降では「Undefined array key」という警告が発生してnullが返ります。一方でPHP 7.x以前では「Undefined offset」や「Undefined index」という診断名の通知(Notice)になるなど、対象のPHPバージョンによって、挙動が異なりました。
バージョンを問わず安全に扱うには、事前にisset()やarray_key_exists()で存在を確認してから参照してください。配列の最後の要素を取得したい場合の書き方は、以下の通りです。
要素の数が固定されていない状況では、end()関数を組み合わせると便利です。ただしend()は配列の内部ポインタを末尾へ移動させる副作用があるため、ポインタの状態を利用する処理と併用する場合は注意する必要があります。
値ではなく最後のキーだけを副作用なく取得したい場合は、array_key_last()関数が選択肢です。ただしPHP 7.3.0以降で追加された関数のため、より古いバージョンの環境を対象にする場合はend()とkey()を組み合わせる方法が安全といえます。
PHPの文字列切り出しに関するよくある質問
2つの特定の文字の間にある文字列を切り出せますか?
strpos関数で開始文字と終了文字の位置を取得し、substr関数に渡すことによって抽出できます。ただしstrposは文字が見つからない場合にfalseを返すため、取得した位置は=== falseで判定してから使用し、終了文字の検索では開始位置より後ろから探すように第三引数を指定して、区切り文字自体のバイト数を切り出し開始位置に加算することが必要です。
固定の記号を区切りにする場合はstrposとsubstrの組み合わせで十分ですが、区切りが複数あるなど複雑なパターンの場合は、正規表現を扱うpreg_match関数を利用するとより柔軟に指定できます。
長い文字列を省略記号付きで切り詰めることはできますか?
PHPには文字列を省略記号付きで切り詰める専用の関数がないため、指定した文字数で切り出した後、末尾に...を連結させる独自の処理を実装します。
日本語が含まれるテキストを処理する際は、文字化けを防ぐためにmb_substr関数で切り詰めた上で記号を結合するのが安全です。
左へフリックで次のページ、右へフリックで前のページに戻れます左右の矢印ボタン、左右のスワイプで移動できます




