【PHP8.x】mb_strimwidth関数の使い方

作成日: 更新日:

mb_strimwidth関数は、マルチバイト文字列を指定された表示幅で切り詰める処理を実行する関数です。この関数は、特に日本語のように全角文字と半角文字が混在する文字列を扱う際に非常に有用です。

主な機能として、元の文字列、切り出し開始位置、そして最も重要な「表示幅」を指定できます。ここで指定する表示幅は、バイト数ではなく、全角文字を2、半角文字を1と数えるような、文字の実際の表示スペースに基づいた幅を指します。これにより、全角文字や半角カナ、絵文字などが含まれる文字列でも、指定した表示幅に収まるように正確にトリムすることが可能です。

引数には、トリム対象の$string、切り出しを開始する文字位置を示す$start、そして最大表示幅を示す$widthを指定します。また、文字列が切り詰められた際に末尾に追加される$trim_marker(例えば"..."など)を設定することもできます。文字列のエンコーディングが異なる場合は、$encoding引数で明示的に指定することで、正確な処理が保証されます。

この関数を使用することで、データベースから取得した長いテキストデータなどを、Webページやアプリケーションの限られた表示領域にきれいに収めることが容易になります。文字化けや表示崩れを防ぎつつ、ユーザーに情報が簡潔に伝わるように整形する際に、非常に強力なツールとして機能します。

基本的な使い方

構文(syntax)

<?php
$trimmed_string = mb_strimwidth("元の長い日本語の文字列です。", 0, 10, "...", "UTF-8");
?>

引数(parameters)

string $string, int $start, int $width, string $trim_marker = '', ?string $encoding = null

  • string $string: 処理対象の文字列
  • int $start: 文字列の開始位置 (0から始まる)
  • int $width: 取得する文字列の最大バイト数
  • string $trim_marker = '': 文字列が切り詰められた場合に末尾に追加する文字列 (省略可能)
  • ?string $encoding = null: 文字エンコーディング (省略すると内部エンコーディングが使用される、省略可能)

戻り値(return)

string

指定されたバイト数または文字数で文字列を切り詰めた結果の文字列を返します。

サンプルコード

mb_strimwidthでマルチバイト文字列を切り詰める

<?php

/**
 * mb_strimwidth関数の使用例
 * マルチバイト文字を含む文字列を指定した幅で切り詰める際に使用します。
 * 主に、長いテキストを一定の文字数に制限して表示したい場合などに役立ちます。
 */

// サンプルとして使用するマルチバイト文字列
$originalString = "これは非常に長い日本語の文字列です。ウェブサイトの記事のタイトルや要約などで使われることを想定しています。";

echo "元の文字列: " . $originalString . "\n\n";

// 例1: 基本的な使用法 - 文字列の先頭から指定した文字数で切り詰める
// 第1引数: 処理する文字列
// 第2引数: 切り取り開始位置 (0は先頭)
// 第3引数: 切り取る幅 (文字数)
$trimmedString1 = mb_strimwidth($originalString, 0, 20);
echo "例1 (開始位置0、幅20、マーカーなし):\n";
echo "結果: " . $trimmedString1 . "\n";
echo "期待される出力: これは非常に長い日本語の文字列です。\n\n";

// 例2: トリムマーカーを追加して切り詰める
// 指定した幅で文字列が切り詰められた場合、第4引数の文字列が末尾に追加されます。
$trimmedString2 = mb_strimwidth($originalString, 0, 25, "...");
echo "例2 (開始位置0、幅25、マーカーあり \"...\"):\n";
echo "結果: " . $trimmedString2 . "\n";
echo "期待される出力: これは非常に長い日本語の文字列です。ウェブサイトの... \n\n";

// 例3: 開始位置を指定して切り詰める
// 文字列の途中から指定した文字数分を切り取ります。
$trimmedString3 = mb_strimwidth($originalString, 10, 15, "(続き)");
echo "例3 (開始位置10、幅15、マーカーあり \"(続き)\"):\n";
echo "結果: " . $trimmedString3 . "\n";
echo "期待される出力: 語の文字列です。ウェブサイトの記事のタイ(続き) \n\n";

// 例4: 指定した幅が元の文字列の長さよりも長い場合
// 文字列は切り詰められず、元の文字列がそのまま返されます。
$trimmedString4 = mb_strimwidth($originalString, 0, 1000, "...");
echo "例4 (幅が元の文字列より長い場合):\n";
echo "結果: " . $trimmedString4 . "\n";
echo "期待される出力: 元の文字列と同じ\n\n";

// PHP 8.4では第5引数としてエンコーディングを指定できますが、
// 通常はPHPの内部エンコーディング設定(多くの場合UTF-8)が適用されるため、省略されることが多いです。
// 必要に応じてエンコーディングを明示することも可能です。
// $trimmedStringWithEncoding = mb_strimwidth($originalString, 0, 20, "...", "UTF-8");

?>

mb_strimwidth関数は、マルチバイト文字(日本語など)を含む文字列を指定した文字幅で切り詰める際に使用されます。長いテキストをウェブサイトの記事タイトルや要約、一覧表示などで一定の文字数に制限して表示したい場合に特に役立ちます。

この関数は以下の引数を取ります。string $stringは処理対象の文字列、int $startは切り取り開始位置(0は先頭)を指定します。int $widthは切り取る文字幅で、これを超えた部分は切り捨てられます。オプションのstring $trim_markerは、文字列が実際に切り詰められた場合に末尾に追加される文字列(例: "...")です。PHP 8.4からは?string $encoding引数でエンコーディングを明示できますが、通常は省略されます。関数は切り詰められた新しい文字列を戻り値として返します。

サンプルコードでは、まず長い日本語文字列を定義し、その後の複数の例でmb_strimwidthの使い方を示しています。

例1は、mb_strimwidth($originalString, 0, 20)として、文字列の先頭から20文字分を切り取ります。結果は「これは非常に長い日本語の文字列です。」です。

例2では、mb_strimwidth($originalString, 0, 25, "...")のように、幅を25文字とし、切り詰められた場合に末尾に"..."を追加します。結果は「これは非常に長い日本語の文字列です。ウェブサイトの...」となります。

例3では、開始位置を10文字目に指定し、そこから15文字分を切り取り、末尾に"(続き)"を追加しています。これは文字列の途中を抜き出す際に便利です。

例4では、指定した幅が元の文字列の長さよりも長いため、文字列は切り詰められず、元の文字列がそのまま返される挙動を示しています。これにより、不必要な切り詰めを防ぐことができます。

このようにmb_strimwidth関数は、マルチバイト文字列を安全かつ柔軟に整形するための重要なツールです。

mb_strimwidth関数は、日本語のようなマルチバイト文字を含む文字列を、バイト数ではなく「文字数」で正確に切り詰める点が特徴です。これにより、途中で文字化けすることなく、見た目通りの長さで文字列を整形できます。第三引数の「幅」には、切り詰められた際に末尾に追加される「トリムマーカー」の文字数も含まれて計算されますので注意が必要です。もし指定した幅が元の文字列の長さよりも長い場合は、文字列は切り詰められずに元のまま返され、トリムマーカーも追加されません。第五引数のエンコーディングは通常PHPの内部設定が適用されるため省略されることが多いですが、異なるエンコーディングを扱う場合は明示的に指定してください。主にウェブサイトのタイトルや要約など、表示スペースが限られる場所で文字列の長さを統一する際に役立ちます。

【PHP8.x】mb_strimwidth関数の使い方 | いっしー@Webエンジニア