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

wordwrap関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

『wordwrap関数は、指定した文字数で文字列を自動的に折り返して改行を挿入する処理を実行する関数です。』 この関数は、長い文章を読みやすく整形するために使用されます。第一引数に対象の文字列を、第二引数には一行あたりの最大文字数を指定します。デフォルトでは75文字で折り返されます。関数は単語の区切り(主にスペース)を認識し、指定された文字数を超えないように適切な場所で改行を挿入します。第三引数には、改行に使用する文字列を指定できます。デフォルトは改行文字 \n ですが、例えばウェブページで表示するために "<br>" のようにHTMLの改行タグを指定することも可能です。第四引数に true を設定すると、指定した文字数よりも長い単語があった場合に、その単語の途中であっても強制的に分割して改行します。デフォルトの false の場合は長い単語を分割しないため、行が指定した文字数を超えることがあります。この関数を利用することで、メール本文やログ出力など、様々な場面でテキストの可読性を向上させることができ、処理結果として改行が挿入された新しい文字列が返されます。

構文(syntax)

1<?php
2$text = "This is a long line of text that needs to be wrapped into smaller pieces.";
3$wrapped_text = wordwrap($text, 20);
4echo $wrapped_text;
5?>

引数(parameters)

string $string, int $width = 75, string $break = "\n", bool $cut_long_words = false

  • string $string: 折り返したい文字列
  • int $width = 75: 1行あたりの最大文字数
  • string $break = "\n": 改行文字として使用する文字列
  • bool $cut_long_words = false: 長すぎる単語を強制的に折り返すかどうか

戻り値(return)

string

指定された文字列を、指定された幅で折り返した新しい文字列を返します。

サンプルコード

PHP wordwrap関数で文字列を折り返す

1<?php
2
3/**
4 * wordwrap関数の使用例を示します。
5 * この関数は、指定された幅で文字列を折り返し、読みやすく整形します。
6 *
7 * @return void
8 */
9function demonstrateWordwrap(): void
10{
11    $longText = "PHPのwordwrap関数は、長いテキストを指定された文字幅で自動的に改行するのに役立ちます。これにより、出力が見やすくなり、特に固定幅の表示領域にテキストを表示する際に非常に便利です。";
12
13    echo "--- 1. デフォルトの設定で折り返し (幅: 75文字, 改行: \\n) ---\n";
14    // デフォルトの幅 (75) と改行文字 (\n) でテキストを折り返します。
15    echo wordwrap($longText);
16    echo "\n\n"; // 出力の区切りを分かりやすくするため
17
18    echo "--- 2. 幅を25文字に指定して折り返し ---\n";
19    // 幅を25文字に設定してテキストを折り返します。
20    echo wordwrap($longText, 25);
21    echo "\n\n";
22
23    echo "--- 3. 幅を30文字に指定し、<br>タグで折り返し ---\n";
24    // 幅を30文字に設定し、改行文字としてHTMLの<br>タグを使用します。
25    echo wordwrap($longText, 30, "<br>");
26    echo "\n\n";
27
28    // 長い単語を含むテキスト
29    $textWithLongWord = "この単語は非常に長い:supercalifragilisticexpialidocious。wordwrap関数がこれをどう処理するか見てみましょう。";
30
31    echo "--- 4. 長い単語を切り詰めずに折り返し (幅: 20文字, デフォルト挙動) ---\n";
32    // 幅を20文字に設定しますが、`cut_long_words`が`false`(デフォルト)のため、
33    // 長い単語は途中で切られずに次の行に送られます。
34    echo wordwrap($textWithLongWord, 20, "\n", false);
35    echo "\n\n";
36
37    echo "--- 5. 長い単語を切り詰めて折り返し (幅: 20文字, cut_long_words = true) ---\n";
38    // 幅を20文字に設定し、`cut_long_words`を`true`にすることで、
39    // 幅を超える長い単語も途中で切って折り返します。
40    echo wordwrap($textWithLongWord, 20, "\n", true);
41    echo "\n\n";
42}
43
44// 関数を実行して、wordwrap関数の動作を確認します。
45demonstrateWordwrap();

PHPのwordwrap関数は、長いテキストを指定された文字幅で自動的に折り返し、読みやすく整形するために使用されます。この関数は、指定された文字列 $string を受け取り、折り返し処理を施した新しい文字列を返します。

第二引数の $width は、テキストを何文字で折り返すかを指定する整数値です。省略した場合はデフォルトで75文字の幅が適用されます。第三引数の $break は、折り返しの際に挿入する文字列を指定します。デフォルトでは改行コードである \n が使用されますが、HTMLの <br> タグなどを指定することも可能です。最後の引数 $cut_long_words は真偽値で、trueを設定すると、指定された幅を超える長い単語も途中で切り詰めて折り返します。false(デフォルト)の場合、単語が途中で切られることはなく、次の行に送られます。

サンプルコードでは、まずデフォルト設定(幅75文字、改行 \n)でテキストを折り返す基本的な動作を示しています。次に、$widthを25文字に指定して折り返し幅を変更する例、そして$breakにHTMLの<br>タグを指定して改行文字を変える例を紹介しています。さらに、長い単語を含むテキストを使い、$cut_long_wordsfalseの場合には単語が途中で切られずに次の行に送られること、trueの場合には単語も切り詰められて折り返されることの違いを具体的に示しています。これにより、テキストの表示領域や用途に応じた柔軟な整形が可能となります。

wordwrap関数は、長い文字列を読みやすい指定の文字幅で自動的に改行する際に役立ちます。利用にあたってはいくつかの注意点があります。まず、日本語のようなマルチバイト文字を含む文字列を扱う場合、この関数は内部的にバイト数を基準とすることがあるため、期待通りの位置で改行されない可能性があります。マルチバイト文字を正確に処理するには、mb_strimwidthなどのマルチバイト対応関数を検討してください。

次に、cut_long_words引数がfalse(デフォルト)の場合、指定した幅よりも長い単語は途中で切られず、単語全体が次の行に送られます。これにより、特定の行だけが指定幅を大きく超えることがあるため、表示レイアウトに影響がないか確認が必要です。

また、break引数にHTMLの<br>タグなどを指定してHTML出力に利用する際は、出力される文字列はエスケープされないため、意図しないタグやスクリプトが挿入されるクロスサイトスクリプティング(XSS)のリスクを避けるため、常に適切なサニタイズ処理を行うよう心がけてください。セキュリティは別途考慮する必要があります。

PHPで日本語を安全にwordwrapする

1<?php
2
3/**
4 * マルチバイト文字(日本語など)に対応したwordwrap関数
5 *
6 * PHP標準のwordwrap()はバイト単位で文字列を処理するため、1文字が複数バイトで
7 * 構成される日本語を正しく扱うことができません。
8 * この関数は、文字数単位で文字列を安全に折り返します。
9 *
10 * @param string $string 対象の文字列
11 * @param int $width 折り返す文字数
12 * @param string $break 改行に使用する文字列
13 * @return string 折り返された文字列
14 */
15function mb_wordwrap(string $string, int $width = 75, string $break = "\n"): string
16{
17    // 文字列を指定した文字数で配列に分割する (PHP 8+)
18    $chunks = mb_str_split($string, $width, 'UTF-8');
19    // 分割した配列の要素を、指定した改行文字列で連結する
20    return implode($break, $chunks);
21}
22
23// サンプルとなる日本語の文章
24$japaneseText = 'この文章は、PHPのwordwrap関数を日本語で正しく扱うためのサンプルコードです。マルチバイト文字列を文字数に基づいて適切に折り返します。';
25
26// 折り返したい文字数
27$wrapWidth = 25;
28
29// 作成した関数を使用して、日本語文字列を25文字で折り返す
30$wrappedText = mb_wordwrap($japaneseText, $wrapWidth, PHP_EOL);
31
32// 結果を出力する (PHP_EOLは環境に合わせた改行コード)
33echo $wrappedText;
34
35echo PHP_EOL . PHP_EOL;
36
37echo "--- 参考: 標準のwordwrap()を使った場合(非推奨) ---" . PHP_EOL;
38// 標準のwordwrap()はバイト数で計算するため、文字化けや意図しない位置で改行される
39$brokenText = wordwrap($japaneseText, $wrapWidth, PHP_EOL, true);
40echo $brokenText;
41
42?>

このサンプルコードは、PHPで日本語のようなマルチバイト文字列を、指定した文字数で正しく折り返す方法を示しています。

PHPに標準で用意されているwordwrap関数は、文字列をバイト数で処理します。アルファベットは1文字1バイトなので問題ありませんが、日本語は1文字が複数バイトで構成されるため、wordwrap関数をそのまま使うと文字の途中で改行されてしまい、文字化けや不自然な分割の原因となります。

この問題を解決するため、サンプルではmb_wordwrapという独自の関数を作成しています。この関数は、内部でmb_str_split関数を使い、文字列をバイト数ではなく「文字数」で正確に分割します。第一引数に処理対象の文字列、第二引数に折り返したい文字数を指定します。その後、implode関数によって、分割された文字列の断片を、第三引数で指定した改行コード(サンプルではPHP_EOL)で連結します。

戻り値として、指定した文字数で適切に改行が挿入された新しい文字列が返されます。このように、日本語を含む文章を扱う場合は、文字数を基準に処理する関数を自作することで、意図した通りに文字列を折り返すことができます。

PHPの標準wordwrap関数は、日本語のようなマルチバイト文字をバイト単位で処理するため、文字数で正確に折り返すことができません。これにより、意図しない場所で文字列が分割されたり、文字化けが発生したりする可能性があります。日本語を含むテキストを安全に文字数で折り返すには、サンプルコードのようにmb_str_split関数を用いた独自の関数を作成することが推奨されます。

PHP 8以降で利用可能なmb_str_split関数は、マルチバイト文字列を文字数単位で分割するのに適しています。この関数を使用する際は、'UTF-8'のように適切な文字エンコーディングを明示的に指定すると良いでしょう。また、改行コードにはPHP_EOL定数を使用することで、WindowsやLinuxなど実行環境に応じた適切な改行が挿入され、コードの移植性が高まります。標準のwordwrap関数は、ASCII文字のみのテキストに限定して利用することをお勧めします。

関連コンテンツ