PHP Tips | 文字列処理:変換系 – 単語の先頭のみ大文字

PHP PHP
スポンサーリンク

「単語の先頭のみ大文字」にしたいって、具体的にどういうこと?

まずゴールのイメージからいきます。

before: hello world
after : Hello World

before: user name
after : User Name

before: php utility functions
after : Php Utility Functions
PHP

こんなふうに、

「単語ごとに、最初の1文字だけ大文字にして、残りはそのまま」

という形にそろえたい——これが「単語の先頭のみ大文字」です。

画面のラベル、ボタン名、タイトル、CSVのヘッダなど、
「ちょっとキレイに見せたい英語の文字列」でよく使います。


PHP の基本:ucfirst と ucwords の違いを押さえる

1単語だけなら ucfirst

ucfirst() は、「文字列の先頭1文字だけ」を大文字にします。

$text = "hello world";

echo ucfirst($text);
// Hello world
PHP

ここでのポイントは、

  • 先頭の h だけが H になる
  • 2単語目の world には手を出さない

ということです。

複数単語をまとめてやるなら ucwords

「単語ごとに先頭を大文字」にしたいときに使うのが ucwords() です。

$text = "hello world php utility";

echo ucwords($text);
// Hello World Php Utility
PHP

スペースで区切られた「単語」ごとに、先頭の1文字を大文字にしてくれます。

「単語の先頭のみ大文字」というユーティリティは、
基本的に ucwords() をベースに考えればOKです。


まずは素直に ucwords を使ってみる

一番シンプルな例

$title = "user name";

$label = ucwords($title);

echo $label;
// User Name
PHP

これだけで、「user name」が「User Name」になります。

すでに大文字・小文字が混ざっている場合

$title = "hELLo wORld";

echo ucwords($title);
// HELLo WORld
PHP

ここで気づいてほしいのは、

  • 先頭の1文字だけ「大文字にする」
  • それ以外の文字は「そのまま」

ということです。

つまり、「全部いったん小文字にしてから、先頭だけ大文字にする」わけではありません。


ちゃんと「先頭だけ大文字」にしたいなら、前処理が大事

一度全部小文字にしてから ucwords する

「HELLo WORld」を「Hello World」にしたいなら、
こういう流れにします。

  1. いったん全部小文字にする
  2. そのあとで、単語の先頭だけ大文字にする

コードにするとこうです。

$text = "hELLo wORld";

// 1. まず全部小文字に
$lower = mb_strtolower($text, 'UTF-8');

// 2. 単語の先頭だけ大文字に
$result = ucwords($lower);

echo $result;
// Hello World
PHP

ここでの重要ポイントは、

  • 「見た目を整えたい」ときは、
    「全部小文字 → 先頭だけ大文字」の2ステップにする
  • 小文字化には mb_strtolower を使う(UTF-8 前提ならこっちが安全)

というところです。


実務ユーティリティとして関数にまとめる

英語タイトル用:「単語の先頭だけ大文字」にそろえる関数

毎回同じ2ステップを書くのは面倒なので、
ユーティリティ関数にしてしまいましょう。

/**
 * 単語の先頭のみ大文字(英語タイトル用・UTF-8 前提)
 *
 * @param string $text
 * @return string
 */
function toTitleCase(string $text): string
{
    // まず全部小文字にそろえる
    $text = mb_strtolower($text, 'UTF-8');

    // 単語の先頭だけ大文字に
    return ucwords($text);
}
PHP

使い方はとてもシンプルです。

echo toTitleCase("user name");        // User Name
echo toTitleCase("hELLo wORld");      // Hello World
echo toTitleCase("php utility tips"); // Php Utility Tips
PHP

これで、「入力がどんな大文字・小文字の混ざり方をしていても」、
最終的に「単語の先頭だけ大文字」にそろえられます。


どんな場面で使うと気持ちいいか

画面ラベルやボタン名を整える

管理画面やツール系のUIで、
英語ラベルを「それっぽく」見せたいときに使えます。

$fieldName = "user name";

$label = toTitleCase($fieldName);
// User Name

echo "<label>{$label}</label>";
PHP

DBや設定ファイルに「user name」「login id」のように保存しておいて、
表示するときだけ toTitleCase() をかける、という設計もアリです。

CSVヘッダやレポートの項目名

CSVやレポートのヘッダ行を、
「全部大文字」ではなく「単語の先頭だけ大文字」にしたいとき。

$columns = [
    'user name',
    'login id',
    'created at',
];

$headers = array_map('toTitleCase', $columns);

// 結果: ['User Name', 'Login Id', 'Created At']
PHP

これだけで、ちょっと「ちゃんとしてる感」が出ます。


日本語やマルチバイト文字との関係

ucwords は「スペース区切り」でしか見ていない

ucwords() は、「スペースで区切られた単語」の先頭だけを見ています。
日本語には基本的に影響しません。

$text = "user 名";

echo ucwords($text);
// User 名
PHP
  • userUser
  • → そのまま

という動きです。

つまり、

「英語部分だけ、単語の先頭を大文字にしたい」
「日本語はそのままでいい」

というケースには、素直にフィットします。


まとめ:今日からの「単語の先頭のみ大文字」ユーティリティ

押さえておきたいポイントをコンパクトにまとめます。

  • 1単語だけなら ucfirst、複数単語なら ucwords を使う。
  • 「見た目をきれいに整えたい」なら、
    「全部小文字 → 単語の先頭だけ大文字」の2ステップにするのが鉄板。
  • 小文字化には mb_strtolower を使い、UTF-8 前提のプロジェクトにそろえる。
  • 共通ユーティリティとして toTitleCase() を用意しておくと、ラベル・ヘッダ・ボタン名などで使い回せる。

実務ユーティリティとしては、まずはこれ一つ置いておけば十分です。

function toTitleCase(string $text): string
{
    $text = mb_strtolower($text, 'UTF-8');
    return ucwords($text);
}
PHP

タイトルとURLをコピーしました