記事内にはプロモーションが含まれています

PHPで文字列を切り出す方法!substrとmb_substrの違いも解説

PHPで文字列を切り出す方法!substrとmb_substrの違いも解説 プログラミングの疑問解決

PHPでプログラミングを行う際、長い文章の先頭部分だけを表示したり、特定のキーワード以降のテキストを取得したりと、文字列の一部を切り出して使いたい場面は非常に多くあります。

PHPには、こうした文字列の切り出しを行うための便利な関数が標準で用意されています。

しかし、英語のような半角文字を扱う場合と、日本語のような全角文字を扱う場合とでは、使うべき関数が異なり、間違った関数を選ぶと「文字化け」の原因になってしまいます。

そこでこの記事では、文字列を切り出すための基本的な関数substr()と、日本語を安全に扱うための必須関数mb_substr()の違いを中心に、具体的なサンプルコードを交えながら徹底的に解説していきます。

【著者プロフィール&本記事の信頼性】
プロフィール
  • 著者は元エンジニア
  • 大手プログラミングスクールのWebディレクター兼 ライターを経験
  • 自らも地元密着型のプログラミングスクールを運営
プロフィール詳細はコチラ
忖度一切なし!
受講生から評判の良いプログラミングスクール
スクール
特徴
受講料金
大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。
657,000円
(最大約53万円の給付金が適用される)
月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。
498,000円
格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。
129,800円~
完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。
完全無料
長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。
96~132万円

【結論】日本語を扱うならmb_substr()を使おう

まず最初に、最も重要な結論をお伝えします。

もし扱う文字列に日本語(ひらがな、カタカナ、漢字など)が含まれる可能性が少しでもあるならば、迷わずmb_substr()関数を使用してください。

古くからあるsubstr()関数は、日本語のようなマルチバイト文字を正しく扱うことができず、文字化けを引き起こす原因となります。

mb_substr()substr()のマルチバイト文字対応版であり、これを使うことで文字化けの心配なく、安全に文字列を切り出すことが可能になります。

mb_substr()の基本的な使い方

それでは、日本語の文字列切り出しにおける標準的な関数であるmb_substr()の基本的な使い方を見ていきましょう。

mb_substr()は、指定した文字列の特定の位置から、指定した文字数分の文字列を返します。

【基本構文】

mb_substr(string $string, int $start, ?int $length = null, ?string $encoding = null)
引数 説明
$string 切り出し対象の元の文字列。
$start 切り出しを開始する位置。最初の文字は0から数える。負の値を指定すると、文字列の末尾から数えた位置になる。
$length 切り出す文字数。省略すると、開始位置から最後までを切り出す。負の値を指定すると、末尾から数えてその文字数分を除いた部分までを切り出す。
$encoding 文字エンコーディング。通常は'UTF-8'を指定する。省略も可能。

サンプルコード

<?php
$str = 'あいうえおかきくけこ';

// 1. 先頭から5文字を切り出す
$result1 = mb_substr($str, 0, 5, 'UTF-8');
echo '1. ' . $result1 . '<br>';

// 2. 3文字目から4文字を切り出す (開始位置は0から数えるので2)
$result2 = mb_substr($str, 2, 4, 'UTF-8');
echo '2. ' . $result2 . '<br>';

// 3. 末尾から3文字を切り出す (開始位置に負の値を指定)
$result3 = mb_substr($str, -3, null, 'UTF-8');
echo '3. ' . $result3 . '<br>';
?>

実行結果

1. あいうえお
2. うえおか
3. くけこ

コードの解説

mb_substrは、文字数を正確に数えてくれるため、日本語の文字列でも意図通りに切り出せていることがわかります。

$startに負の値を指定すると、末尾からの位置指定となり、非常に便利です。

substr()とmb_substr()の決定的な違い

では、なぜsubstr()ではダメなのでしょうか。

substr()mb_substr()の決定的な違いは、文字を数える単位にあります。

  • substr(): 文字列をバイト単位で処理します。
  • mb_substr(): 文字列を文字単位で処理します。

アルファベットや数字などの半角文字は、基本的に1文字が1バイトです。
しかし、日本語のひらがなや漢字などの全角文字は、UTF-8エンコーディングの場合、1文字が3バイト以上のデータ量を持っています。

この違いが、文字化けの原因となるのです。

substr()で日本語を切り出すと失敗する例

<?php
$str_ja = '今日は良い天気です';
$str_en = 'Hello World';

// 半角英字の場合は問題なく動作する
$result_en = substr($str_en, 0, 5);
echo '英語の場合: ' . $result_en . '<br>';

// 日本語の場合、文字化けが発生する
$result_ja_fail = substr($str_ja, 0, 5);
echo '日本語をsubstrで処理した場合: ' . $result_ja_fail . '<br>';

// mb_substrを使えば正しく処理される
$result_ja_success = mb_substr($str_ja, 0, 5, 'UTF-8');
echo '日本語をmb_substrで処理した場合: ' . $result_ja_success . '<br>';
?>

実行結果

英語の場合: Hello
日本語をsubstrで処理した場合: 今日は良
日本語をmb_substrで処理した場合: 今日は良い天

コードの解説

substr($str_ja, 0, 5)は、「先頭から5バイト分のデータを切り出す」という命令になります。

UTF-8の「天気」の「天」は3バイトで表現されるため、5バイト分だと「今日」の次の「は」の途中までしか切り出せず、中途半端なデータとなった結果、文字化け(“)が発生してしまいました。

一方、mb_substr()は文字数を正確に数えて「先頭から5文字」を切り出すため、意図通り「今日は良い天」という結果が得られます。

この挙動の違いが、日本語を扱う際にmb_substr()が必須である理由です。

「特定の文字まで」「特定の文字から」文字列を切り出す

文字数や位置だけでなく、「特定のキーワードが現れるまでの部分」や「キーワード以降の部分」を切り出したいという需要も非常に多くあります。

特定の文字までの文字列を切り出す

これには、まずキーワードの位置をmb_strpos()で探し、その位置までの文字列をmb_substr()で切り出す、という2段階の処理を行います。

<?php
$sentence = 'この記事ではPHPの文字列操作について解説します。';
$keyword = 'について';

// キーワード'について'が最初に現れる位置を探す
$position = mb_strpos($sentence, $keyword, 0, 'UTF-8');

// キーワードの位置が見つかった場合
if ($position !== false) {
    // 先頭からキーワードの位置までを切り出す
    $result = mb_substr($sentence, 0, $position, 'UTF-8');
    echo $result;
}
?>

実行結果は以下の通りです。

この記事ではPHPの文字列操作

特定の文字以降の文字列を切り出す

これにはmb_strstr()関数が便利です。

mb_strstr()は、指定したキーワードが最初に現れた位置から、文字列の最後までを返します。

<?php
$sentence = 'お問い合わせはsupport@example.comまでお願いします。';
$keyword = '@';

// @以降の文字列を取得する(@も含まれる)
// 第3引数をtrueにすると、@の前の部分が取得できる
$result = mb_strstr($sentence, $keyword, false, 'UTF-8');

echo $result;
?>

実行結果は以下の通りです。

@example.comまでお願いします。

目的別!文字列切り出しの関数早見表

最後に、この記事で紹介した関数を目的別にまとめます。

目的 推奨関数 備考
日本語を含む文字列の切り出し mb_substr() 最も基本的で安全な方法。
半角英数字のみの文字列の切り出し substr() 互換性のために存在。新規開発ではmb_substrで統一するのが無難。
特定文字までを切り出す mb_strpos() + mb_substr() キーワードの位置を調べてから切り出す。
特定文字からを切り出す mb_strstr() キーワード以降の文字列を一発で取得できる。

まとめ

今回は、PHPで文字列を切り出すための方法について、特に日本語を扱う際の重要性に焦点を当てて解説しました。

なお、PHPを体系的に学んだり、PHPのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。

細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。

Follow me!

PAGE TOP