[PHP]ucwordsとは?各単語の先頭を大文字にするタイトルケース変換を徹底解説

PHP

はじめに

前回の記事では、文字列の先頭1文字だけを大文字にする ucfirst() を解説しました。今回はその仲間である ucwords() を紹介します。

ucwords() は、文字列中の各単語の先頭文字を大文字に変換する関数です。いわゆる「タイトルケース」(Title Case)に変換したいとき、たとえば "the quick brown fox""The Quick Brown Fox" のようにすべての単語の頭文字を大文字化したい場合に使います。書籍のタイトルや記事の見出し、人名の整形など、応用範囲の広い関数です。本記事では基本的な使い方から、区切り文字のカスタマイズ、マルチバイト対応まで、実践的なコード例とともに詳しく解説します。


関数概要

項目内容
関数名ucwords()
所属拡張コア関数(標準で常に利用可能)
シグネチャucwords(string $string, string $separators = " \t\r\n\f\v"): string
引数1$string — 変換対象の文字列
引数2$separators — 単語の区切りとみなす文字(省略時は空白系文字)
戻り値各単語の先頭文字が大文字に変換された文字列
対応バージョンPHP 4以降($separators 引数はPHP 5.5以降)
類似関数ucfirst()(文字列全体の先頭のみを大文字化)
マルチバイト対応非対応(ASCII文字のみが対象)

変換の流れ(イメージ図)

  入力文字列
  "the quick-brown fox"
              │
              ▼
        ucwords()
              │
   ┌──────────┴──────────────┐
   │ デフォルトの区切り文字は空白のみ │
   │ ("-"はデフォルトでは区切りとみなされない) │
   └──────────┬──────────────┘
              ▼
  "The Quick-brown Fox"
        ▲            ▲
        │            └─ ハイフンの後は区切り文字指定がないと大文字化されない
        └─ 空白の後は大文字化される

ポイントは、ucwords()デフォルトの区切り文字はスペースやタブなどの空白系文字のみであり、ハイフン - やアンダースコア _ は含まれないという点です。"quick-brown" のようなハイフン区切りの単語をタイトルケース化したい場合は、第2引数 $separators を明示的に指定する必要があります。


実践サンプル7選

例1:基本的な使い方

<?php

class BasicTitleCaser
{
    public function toTitleCase(string $string): string
    {
        // デフォルトでは空白を区切りとして各単語の先頭を大文字化する
        return ucwords($string);
    }
}

$titleCaser = new BasicTitleCaser();
echo $titleCaser->toTitleCase('the quick brown fox') . PHP_EOL;
// "The Quick Brown Fox"

例2:記事タイトルを整形するクラス

<?php

class ArticleTitleFormatter
{
    /**
     * ユーザーが小文字で入力した記事タイトルを
     * タイトルケースに整形する
     */
    public function format(string $rawTitle): string
    {
        $trimmed = trim($rawTitle);
        $lowered = strtolower($trimmed);

        // 全体を小文字化してからucwords()で各単語の先頭を大文字化
        return ucwords($lowered);
    }
}

$formatter = new ArticleTitleFormatter();
echo $formatter->format('  HOW TO learn PHP fast  ') . PHP_EOL;
// "How To Learn Php Fast"

例3:区切り文字をカスタマイズしてハイフン区切りにも対応する

<?php

class CustomSeparatorTitleCaser
{
    /**
     * デフォルトでは対応していないハイフンやアンダースコアも
     * 区切り文字として指定することで対応させる
     */
    public function toTitleCase(string $string): string
    {
        // 空白に加えて "-" と "_" も区切り文字として指定
        return ucwords($string, " \t\r\n\f\v-_");
    }
}

$caser = new CustomSeparatorTitleCaser();
echo $caser->toTitleCase('quick-brown_fox jumps') . PHP_EOL;
// "Quick-Brown_Fox Jumps"

例4:ucfirstとucwordsの挙動比較

<?php

class CapitalizationComparator
{
    /**
     * ucfirst()(先頭1文字のみ)とucwords()(全単語の先頭)の
     * 違いを比較する
     */
    public function compare(string $string): array
    {
        return [
            'ucfirst' => ucfirst($string),
            'ucwords' => ucwords($string),
        ];
    }
}

$comparator = new CapitalizationComparator();
print_r($comparator->compare('open source software'));
// ucfirst: "Open source software"
// ucwords: "Open Source Software"

例5:人名を正しいタイトルケースに整形するクラス

<?php

class PersonNameFormatter
{
    /**
     * "MCDONALD" や "mcdonald" のような表記ゆれのある姓名を
     * 一般的な表記に整形する(簡易版)
     */
    public function format(string $rawName): string
    {
        $normalized = strtolower(trim($rawName));

        // スペースだけでなくハイフンでつながる姓(例: "Smith-Jones")にも対応
        return ucwords($normalized, " \t\r\n\f\v-");
    }
}

$formatter = new PersonNameFormatter();
echo $formatter->format('JOHN SMITH-JONES') . PHP_EOL; // "John Smith-Jones"
echo $formatter->format('mary o\'brien') . PHP_EOL;      // "Mary O'brien" (アポストロフィは非対応)

例6:CSVヘッダーやラベルをタイトルケースに変換するツール

<?php

class CsvHeaderFormatter
{
    /**
     * "user_registration_date" のようなスネークケースの
     * ヘッダー名を、人間が読みやすいタイトルケースのラベルに変換する
     */
    public function toLabel(string $snakeCaseHeader): string
    {
        // アンダースコアをスペースに置換してからタイトルケース化
        $withSpaces = str_replace('_', ' ', $snakeCaseHeader);
        return ucwords($withSpaces);
    }
}

$formatter = new CsvHeaderFormatter();
echo $formatter->toLabel('user_registration_date') . PHP_EOL; // "User Registration Date"
echo $formatter->toLabel('total_price_jpy') . PHP_EOL;          // "Total Price Jpy"

例7:マルチバイト文字を安全にタイトルケース化する拡張実装

<?php

class MultibyteSafeTitleCaser
{
    /**
     * ucwords()はマルチバイト文字に非対応のため、
     * mb_convert_case()を使って安全にタイトルケース化する
     */
    public function toTitleCase(string $string, string $encoding = 'UTF-8'): string
    {
        // MB_CASE_TITLEを指定すると各単語の先頭が大文字になる
        return mb_convert_case($string, MB_CASE_TITLE, $encoding);
    }
}

$safeCaser = new MultibyteSafeTitleCaser();
echo $safeCaser->toTitleCase('café society élan') . PHP_EOL;
// "Café Society Élan"
// ucwords('café society élan') では正しく変換されない点に注意

関連関数との比較

関数役割ucwordsとの違い
ucwords()各単語の先頭文字を大文字にする本記事の対象。区切り文字を第2引数でカスタマイズ可能
ucfirst()文字列全体の先頭1文字のみを大文字にする対象が文字列全体の先頭だけである点が異なる
lcfirst()文字列全体の先頭1文字を小文字にするucfirst()の逆の変換を行う
strtoupper()文字列全体をすべて大文字にする単語単位ではなく全文字を変換する
mb_convert_case()マルチバイト対応の大文字/小文字変換MB_CASE_TITLE を指定することでucwords()のマルチバイト版として使える

よくある落とし穴(注意点)

  1. デフォルトの区切り文字は空白のみ ハイフンやアンダースコアはデフォルトでは区切りとみなされません。"well-known" のような単語をタイトルケース化したい場合は、第2引数 $separators に明示的にハイフンを含める必要があります(例3を参照)。
  2. マルチバイト文字(日本語やアクセント付き文字)には対応していない ucwords() はASCII文字を前提としており、"café society" のようなアクセント付き文字には正しく機能しません。マルチバイト対応が必要な場合は mb_convert_case()MB_CASE_TITLE を使いましょう。
  3. アポストロフィを含む単語の扱い "o'brien" のような単語では、アポストロフィの後ろの文字は大文字化されません("O'brien" となり "O'Brien" にはならない)。完全に正しい人名整形を行うには、追加のロジックが必要です。
  4. すべて大文字の単語はそのまま維持される ucwords("PHP is GREAT") の結果は "PHP Is GREAT" となり、元から大文字だった部分はそのまま残ります。統一的な見た目にしたい場合は、事前に strtolower() で全体を小文字化してから適用するとよいでしょう(例2を参照)。
  5. 区切り文字を指定する際は元のデフォルト値を維持することを忘れない 第2引数を指定する際に空白文字(" \t\r\n\f\v")を含め忘れると、通常のスペース区切りでの大文字化が機能しなくなってしまいます。カスタマイズする際は、デフォルト値に追加する形で指定するのが安全です。

まとめ

観点まとめ
何をする関数か文字列中の各単語の先頭文字を大文字に変換する(タイトルケース化)
主な用途記事タイトルの整形、人名の整形、CSVヘッダーのラベル化など
区切り文字第2引数でカスタマイズ可能(デフォルトは空白系文字のみ)
マルチバイト対応非対応。日本語やアクセント付き文字にはmb_convert_case()MB_CASE_TITLEを使う
注意点デフォルトの区切り文字の制限、マルチバイト非対応、アポストロフィの扱い

ucwords() はタイトルケース変換の定番関数ですが、区切り文字のデフォルト設定やマルチバイト非対応といった制約を正しく理解しておくことが重要です。用途に応じて第2引数のカスタマイズや mb_convert_case() との使い分けを行い、思い通りの表記に整形しましょう。

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