「単語の先頭のみ大文字」にしたいって、具体的にどういうこと?
まずゴールのイメージからいきます。
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」にしたいなら、
こういう流れにします。
- いったん全部小文字にする
- そのあとで、単語の先頭だけ大文字にする
コードにするとこうです。
$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>";
PHPDBや設定ファイルに「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 名
PHPuser→User名→ そのまま
という動きです。
つまり、
「英語部分だけ、単語の先頭を大文字にしたい」
「日本語はそのままでいい」
というケースには、素直にフィットします。
まとめ:今日からの「単語の先頭のみ大文字」ユーティリティ
押さえておきたいポイントをコンパクトにまとめます。
- 1単語だけなら
ucfirst、複数単語ならucwordsを使う。 - 「見た目をきれいに整えたい」なら、
「全部小文字 → 単語の先頭だけ大文字」の2ステップにするのが鉄板。 - 小文字化には
mb_strtolowerを使い、UTF-8 前提のプロジェクトにそろえる。 - 共通ユーティリティとして
toTitleCase()を用意しておくと、ラベル・ヘッダ・ボタン名などで使い回せる。
実務ユーティリティとしては、まずはこれ一つ置いておけば十分です。
function toTitleCase(string $text): string
{
$text = mb_strtolower($text, 'UTF-8');
return ucwords($text);
}
PHP