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

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

作成日: 更新日:

基本的な使い方

ucwords関数は、指定された文字列に含まれる各単語の最初の文字を大文字に変換する処理を実行する関数です。この関数における「単語」とは、区切り文字の直後に続く文字列として定義されます。デフォルトで単語の区切りと見なされる文字には、スペース、タブ、改行文字などが含まれます。例えば、文字列 'hello world' に対してこの関数を使用すると、'Hello World' という結果が返されます。オプションの第二引数として、区切り文字として扱いたい文字の集合を文字列で指定することも可能です。これにより、ハイフンやアンダースコアといったデフォルト以外の文字を単語の区切りとして認識させることができます。例えば、'first-last' という文字列に対し、区切り文字として '-' を指定すれば 'First-Last' という結果を得られます。ただし、この関数はシングルバイト文字のみを対象としており、日本語のようなマルチバイト文字には正しく対応していません。マルチバイト文字列の各単語の先頭を大文字に変換したい場合は、代わりに mb_convert_case 関数を MB_CASE_TITLE モードで利用する必要があります。

構文(syntax)

1<?php
2
3$string = "hello world";
4$capitalized_string = ucwords($string); // 結果: "Hello World"
5

引数(parameters)

string $string, string $separators = " \t\r\n\f\v"

  • string $string: 単語の先頭を大文字に変換したい文字列
  • string $separators = " \t\r\n\f\v": 単語の区切り文字として使用する文字列。デフォルトではスペース、タブ、改行などが含まれます。

戻り値(return)

string

引数で渡された文字列の各単語の先頭の文字を大文字に変換した新しい文字列を返します。

サンプルコード

PHP ucwords() の区切り文字問題と解決策

1<?php
2
3/**
4 * ucwords() 関数の動作を、デフォルトの区切り文字とカスタム区切り文字でデモンストレーションします。
5 *
6 * 特に「ucwordsが期待通りに動作しない」という一般的な疑問(例えば、ハイフンで区切られた単語が
7 * 大文字にならない、など)に焦点を当てて説明します。
8 */
9function demonstrateUcwordsFunction(): void
10{
11    echo "--- ucwords() 関数のデモンストレーション ---\n\n";
12
13    // ケース 1: デフォルトの区切り文字(スペース、タブ、改行など)を使用した場合。
14    // 各単語の最初の文字が大文字になります。
15    $string1 = "hello world! this is a test string.";
16    $result1 = ucwords($string1);
17    echo "1. デフォルトの区切り文字の場合:\n";
18    echo "   元の文字列: \"{$string1}\"\n";
19    echo "   結果:     \"{$result1}\"\n";
20    echo "   (期待: Hello World! This Is A Test String.)\n\n";
21
22    // ケース 2: ucwords() が「期待通りに動作しない」と感じる一般的なシナリオ。
23    // ハイフンはデフォルトの区切り文字ではないため、ハイフンで区切られた単語は
24    // 大文字になりません。
25    $string2 = "this-is-a-hyphenated-string-example.";
26    $result2 = ucwords($string2);
27    echo "2. 「動作しない」と感じる一般的なシナリオ (ハイフン区切り):\n";
28    echo "   元の文字列: \"{$string2}\"\n";
29    echo "   結果:     \"{$result2}\"\n";
30    echo "   (期待: This-is-a-hyphenated-string-example. - 'is', 'a', 'hyphenated'などは大文字になっていません。)\n\n";
31
32    // ケース 3: カスタム区切り文字を指定して、上記の「動作しない」問題を解決する。
33    // デフォルトの区切り文字に加えてハイフンも区切り文字として指定します。
34    // これにより、ハイフンで区切られた単語も正しく大文字になります。
35    // 第2引数には、区切り文字として認識させたい文字をすべて含んだ文字列を渡します。
36    $string3 = "this-is-a-hyphenated-string-example.";
37    $customSeparators = " \t\r\n\f\v-"; // デフォルトの区切り文字にハイフンを追加
38    $result3 = ucwords($string3, $customSeparators);
39    echo "3. カスタム区切り文字で「動作しない」問題を解決 (ハイフンを追加):\n";
40    echo "   元の文字列: \"{$string3}\"\n";
41    echo "   カスタム区切り文字: \"{$customSeparators}\"\n";
42    echo "   結果:     \"{$result3}\"\n";
43    echo "   (期待: This-Is-A-Hyphenated-String-Example. - すべての単語が大文字になっています。)\n\n";
44
45    // ケース 4: 複数のカスタム区切り文字を指定する例。
46    // スラッシュやアンダースコアも区切り文字として認識させます。
47    $string4 = "path/to/my_file.php";
48    $customSeparators2 = " /_"; // スペース、スラッシュ、アンダースコア
49    $result4 = ucwords($string4, $customSeparators2);
50    echo "4. 複数のカスタム区切り文字の例 (スペース、スラッシュ、アンダースコア):\n";
51    echo "   元の文字列: \"{$string4}\"\n";
52    echo "   カスタム区切り文字: \"{$customSeparators2}\"\n";
53    echo "   結果:     \"{$result4}\"\n";
54    echo "   (期待: Path/To/My_File.php)\n\n";
55}
56
57// デモンストレーション関数を実行します。
58demonstrateUcwordsFunction();

PHP 8のucwords関数は、文字列内の各単語の最初の文字を大文字に変換する機能を提供します。第一引数$stringには処理したい文字列を渡します。この関数は、変換された新しい文字列を戻り値として返します。

この関数には第二引数$separatorsがあり、これは単語の区切りとなる文字を指定するものです。デフォルトでは、スペース、タブ、改行などが区切り文字として認識されます。そのため、「hello-world」のようなハイフンで区切られた文字列の場合、デフォルトの区切り文字ではハイフンが単語の区切りとして認識されず、「Hello-world」のようにハイフン以降の単語が大文字にならないことがあります。これが「ucwordsが期待通りに動作しない」と感じる一般的な理由です。

このような場合は、第二引数$separatorsにカスタムの区切り文字を指定することで解決できます。例えば、ハイフンも区切り文字として含めたい場合は、デフォルトの区切り文字にハイフンを追加した文字列(例: " \t\r\n\f\v-")を第二引数に渡します。これにより、ハイフンで区切られた単語も正しく大文字に変換され、「Hello-World」のように意図通りの結果が得られます。スラッシュやアンダースコアなど、複数の文字を区切り文字として指定することも可能です。

PHPのucwords関数は、文字列内の各単語の最初の文字を大文字に変換します。最も重要な注意点は、単語の区切りと認識される文字についてです。デフォルトではスペース、タブ、改行などが区切り文字として扱われますが、ハイフンやスラッシュなどの記号は含まれません。このため、「this-is-a-string」のようにデフォルトに含まれない記号で区切られた単語は、期待通りに大文字にならないことがあります。これが「ucwordsが期待通りに動作しない」と感じる主な原因です。この問題を解決するには、関数の第2引数にカスタムの区切り文字を指定してください。その際、スペースなどデフォルトで区切り文字として扱わせたい文字も忘れずに含める必要があります。これにより、意図した通りの文字列変換が可能です。

PHP ucwordsとUTF-8文字の扱い

1<?php
2
3// PHP 8では、mbstring関数はデフォルトでUTF-8エンコーディングを仮定しますが、
4// 明示的に設定することで、より堅牢なコードになります。
5// アプリケーション全体で一貫したエンコーディングを使用することが推奨されます。
6mb_internal_encoding("UTF-8");
7
8/**
9 * ucwords関数の基本的な挙動、UTF-8文字列での注意点、
10 * そしてUTF-8文字列を正しく処理するための代替手段をデモンストレーションします。
11 *
12 * ucwords関数は、文字列の各単語の最初の文字を大文字にしますが、
13 * マルチバイト文字(UTF-8など)には対応していません。
14 * UTF-8文字列を正しくタイトルケース(単語の先頭を大文字)に変換するには、
15 * mb_convert_case関数を使用するのが推奨されます。
16 */
17function demonstrateUcwordsAndUtf8(): void
18{
19    echo "--- ucwords() の基本的な動作 (ASCII文字) ---\n";
20    $asciiString = "hello world php programming";
21    $ucwordsResultAscii = ucwords($asciiString);
22    echo "元の文字列: '{$asciiString}'\n";
23    echo "ucwords() の結果: '{$ucwordsResultAscii}'\n\n"; // 期待される結果: Hello World Php Programming
24
25    echo "--- ucwords() のカスタム区切り文字の例 (ASCII文字) ---\n";
26    $dashedString = "hello-world_php.programming";
27    // デフォルトの区切り文字 (スペース、タブなど) に加えて、
28    // ハイフンとアンダースコアを区切り文字として指定します。
29    $ucwordsCustomSeparators = ucwords($dashedString, "-_");
30    echo "元の文字列: '{$dashedString}'\n";
31    echo "ucwords() (区切り文字: -_) の結果: '{$ucwordsCustomSeparators}'\n\n"; // 期待される結果: Hello-World_Php.Programming
32
33    echo "--- ucwords() がUTF-8文字列で期待通りに動作しない例 ---\n";
34    $utf8String = "こんにちは 世界 php プログラミング";
35    $ucwordsResultUtf8 = ucwords($utf8String);
36    echo "元のUTF-8文字列: '{$utf8String}'\n";
37    echo "ucwords() の結果 (期待しない動作): '{$ucwordsResultUtf8}'\n";
38    echo "  (解説: マルチバイト文字の「こ」や「プ」が正しく大文字化されていません。)\n\n";
39
40    echo "--- UTF-8文字列を正しくタイトルケース化するための代替手段 (mb_convert_case) ---\n";
41    // mb_convert_case関数はマルチバイト文字に対応しており、
42    // MB_CASE_TITLEフラグで各単語の最初の文字を大文字に、それ以外の文字を小文字に変換します。
43    // 第3引数で明示的にエンコーディング("UTF-8")を指定することが推奨されます。
44    $mbConvertCaseResultUtf8 = mb_convert_case($utf8String, MB_CASE_TITLE, "UTF-8");
45    echo "元のUTF-8文字列: '{$utf8String}'\n";
46    echo "mb_convert_case(..., MB_CASE_TITLE) の結果: '{$mbConvertCaseResultUtf8}'\n\n"; // 期待される結果: こんにちは 世界 Php プログラミング
47
48    // 補足: mb_convert_caseにはucwordsのように直接的なカスタム区切り文字を指定する機能はありません。
49    // より複雑なマルチバイト文字列の単語区切り処理が必要な場合は、
50    // 正規表現とmb_ereg_replace()などを組み合わせて使用することが考えられます。
51}
52
53// デモンストレーション関数を実行します。
54demonstrateUcwordsAndUtf8();

PHP 8のucwords関数は、指定された文字列の各単語の最初の文字を大文字に変換する機能を提供します。この関数は、PHPの標準的なextensionに属するfunctionです。第一引数には処理対象のstring型の文字列を渡し、オプションの第二引数$separatorsには単語の区切りとして認識する文字群をstring型で指定できます。デフォルトでは半角スペースやタブなどが区切り文字として扱われ、処理結果はstring型の文字列として返されます。

例えば、「hello world php programming」のようなASCII文字列では、「Hello World Php Programming」のように各単語の先頭が大文字に変換されます。カスタム区切り文字を指定することで、「hello-world_php」のような文字列も「Hello-World_Php」と変換することが可能です。

しかし、ucwords関数はマルチバイト文字であるUTF-8文字列に完全には対応していません。そのため、「こんにちは 世界 php プログラミング」のような日本語を含む文字列に適用すると、マルチバイト文字の単語が期待通りに大文字化されない問題が生じます。UTF-8文字列を正しくタイトルケース(各単語の先頭を大文字)に変換するには、mb_convert_case関数を使用するのが推奨されます。mb_convert_case関数をMB_CASE_TITLEフラグとともに「UTF-8」エンコーディングを指定して使用することで、日本語を含むマルチバイト文字列も「こんにちは 世界 Php プログラミング」のように適切に処理できます。

ucwords関数は、英数字(ASCII文字)の文字列で各単語の最初の文字を大文字にすることに適していますが、日本語などのUTF-8(マルチバイト)文字列には対応していません。マルチバイト文字を含む文字列に使用すると、正しく機能しないため注意が必要です。

UTF-8文字列をタイトルケースに変換する場合は、mb_convert_case関数とMB_CASE_TITLEフラグ、そしてエンコーディングとして"UTF-8"を明示的に指定して利用してください。mb_internal_encoding("UTF-8");でアプリケーション全体の内部エンコーディングを統一すると、より安全なコードになります。ucwordsにはカスタム区切り文字を指定できますが、mb_convert_caseには同様の機能が直接ありませんので、その点も留意してください。

関連コンテンツ

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