PHPでの大文字・小文字の変換について

採用はこちら

PHPで文字列の大文字・小文字を変換するには、主に以下の関数を使います。

strtolower()
strtoupper()
ucfirst()
lcfirst()
ucwords()
mb_strtolower()
mb_strtoupper()
mb_convert_case()

英数字だけを扱う場合は、strtolower()strtoupper() などの通常の文字列関数で対応できます。

一方で、日本語サイトや多言語サイトのように、アクセント付き文字、全角英字、Unicode文字などを扱う可能性がある場合は、mb_strtolower()mb_strtoupper() などのマルチバイト対応関数を使うのが安全です。

特に実務では、ユーザー入力、検索キーワード、メールアドレス、URLスラッグ、商品名、記事タイトルなどを扱うことが多いため、文字コードやマルチバイト文字への対応を意識する必要があります。

目次

PHPで小文字に変換する方法

strtolower()で小文字に変換する

PHPで英字を小文字に変換するには、strtolower() を使います。

$text = "Hello World";
echo strtolower($text);

出力結果は以下の通りです。

hello world

strtolower() は、文字列内の大文字アルファベットを小文字に変換する関数です。

$name = "TARO YAMADA";

echo strtolower($name);

出力結果:

taro yamada

ただし、strtolower() が安全に扱えるのは、基本的にASCII範囲の英字です。

たとえば、以下のような文字列では注意が必要です。

$text = "CAFÉ";
echo strtolower($text);

この場合、CAF のようなASCII英字は小文字に変換されますが、É のような非ASCII文字は期待通りに変換されない可能性があります。

そのため、アクセント付き文字や多言語文字を含む可能性がある場合は、後述する mb_strtolower() を使うのがおすすめです。

mb_strtolower()でマルチバイト文字を小文字に変換する

日本語サイトや多言語サイトでは、strtolower() ではなく mb_strtolower() を使うと安全です。

$text = "HELLO CAFÉ";
echo mb_strtolower($text, 'UTF-8');

出力例:

hello café

mb_strtolower() は、マルチバイト文字列に対応した小文字変換関数です。

通常の英字だけでなく、アクセント付き文字などの非ASCII文字も考慮して変換できます。

$text = "PHP PROGRAMMING";
$lower = mb_strtolower($text, 'UTF-8');

echo $lower;

出力結果:

php programming

実務では、エンコーディングに 'UTF-8' を明示しておくとわかりやすいです。

mb_strtolower($text, 'UTF-8');

現在のWebサイトではUTF-8を使うことが一般的なため、特別な理由がなければこの書き方で問題ありません。

PHPで大文字に変換する方法

strtoupper()で大文字に変換する

PHPで英字を大文字に変換するには、strtoupper() を使います。

$text = "Hello World";
echo strtoupper($text);

出力結果:

HELLO WORLD

strtoupper() は、文字列内の小文字アルファベットを大文字に変換する関数です。

$text = "php programming";

echo strtoupper($text);

出力結果:

PHP PROGRAMMING

ただし、strtoupper()strtolower() と同じく、基本的にはASCII範囲の英字を対象にした関数です。

そのため、以下のような文字列を扱う場合は注意が必要です。

$text = "café";
echo strtoupper($text);

アクセント付き文字などを含む場合、期待通りに大文字化されない可能性があります。

多言語対応を考えるなら、mb_strtoupper() を使いましょう。

mb_strtoupper()でマルチバイト文字を大文字に変換する

非ASCII文字を含む文字列を大文字に変換したい場合は、mb_strtoupper() を使います。

$text = "hello café";
echo mb_strtoupper($text, 'UTF-8');

出力例:

HELLO CAFÉ

mb_strtoupper() は、マルチバイト文字列に対応した大文字変換関数です。

$text = "php programming";
$upper = mb_strtoupper($text, 'UTF-8');

echo $upper;

出力結果:

PHP PROGRAMMING

英語だけを扱う小さな処理であれば strtoupper() でも十分ですが、ユーザー入力や多言語文字列を扱うWebアプリケーションでは、mb_strtoupper() を使うほうが安全です。

文字列の先頭だけ大文字・小文字に変換する方法

ucfirst()で先頭1文字を大文字にする

文字列の先頭1文字だけを大文字にしたい場合は、ucfirst() を使います。

$text = "hello world";
echo ucfirst($text);

出力結果:

Hello world

ucfirst() は、文字列全体ではなく、最初の1文字だけを大文字に変換します。

$title = "php basics";

echo ucfirst($title);

出力結果:

Php basics

ここで注意したいのは、ucfirst() は単語ごとの先頭文字を大文字にする関数ではないという点です。

たとえば、以下のように書いても、2語目の world は大文字になりません。

$text = "hello world";

echo ucfirst($text);

出力結果:

Hello world

単語ごとの先頭文字を大文字にしたい場合は、後述する ucwords() を使います。

lcfirst()で先頭1文字を小文字にする

文字列の先頭1文字だけを小文字にしたい場合は、lcfirst() を使います。

$text = "Hello World";
echo lcfirst($text);

出力結果:

hello World

lcfirst() は、文字列の最初の1文字だけを小文字に変換します。

$className = "UserController";

echo lcfirst($className);

出力結果:

userController

クラス名から変数名を作る場合などに使われることがあります。

ただし、ucfirst()lcfirst() も、基本的にはASCII範囲の英字を対象にした関数として考えたほうが安全です。

非ASCII文字を含む文字列を扱う場合は、mb_convert_case() などのマルチバイト対応関数を検討しましょう。

単語ごとの先頭文字を大文字に変換する方法

ucwords()で各単語の先頭を大文字にする

文字列内の各単語の先頭文字を大文字にしたい場合は、ucwords() を使います。

$text = "hello world";
echo ucwords($text);

出力結果:

Hello World

名前や簡単な英語タイトルを整形するときに便利です。

$name = "taro yamada";

echo ucwords($name);

出力結果:

Taro Yamada

ただし、ucwords() は本格的なタイトルケースを作る関数ではありません。

たとえば、英語の記事タイトルでは、andofthe などを小文字のままにするルールがあります。

しかし、ucwords() はそのような文法的判断までは行いません。

$title = "the lord of the rings";

echo ucwords($title);

出力結果:

The Lord Of The Rings

自然な英語タイトルとしては、ofthe の扱いを別途調整したい場合があります。

また、ucwords() もASCII中心の関数として考える必要があります。

多言語文字列を扱う場合は、mb_convert_case() を使うほうが安全です。

mb_convert_case()で大文字・小文字を柔軟に変換する方法

mb_convert_case()の基本的な使い方

mb_convert_case() は、指定したモードに応じて文字列を変換できる関数です。

大文字化、小文字化、タイトルケース化などを柔軟に行えます。

$text = "hello world";

echo mb_convert_case($text, MB_CASE_UPPER, 'UTF-8');
echo mb_convert_case($text, MB_CASE_LOWER, 'UTF-8');
echo mb_convert_case($text, MB_CASE_TITLE, 'UTF-8');

出力例:

HELLO WORLD
hello world
Hello World

主なモードは以下の通りです。

モード内容
MB_CASE_UPPER大文字に変換する
MB_CASE_LOWER小文字に変換する
MB_CASE_TITLE単語の先頭を大文字に変換する
MB_CASE_FOLD大文字・小文字の差をなくす比較向けの変換を行う

基本的な大文字・小文字変換であれば、以下のように使えます。

$text = "Hello PHP";

$upper = mb_convert_case($text, MB_CASE_UPPER, 'UTF-8');
$lower = mb_convert_case($text, MB_CASE_LOWER, 'UTF-8');
$title = mb_convert_case($text, MB_CASE_TITLE, 'UTF-8');

echo $upper . PHP_EOL;
echo $lower . PHP_EOL;
echo $title . PHP_EOL;

出力例:

HELLO PHP
hello php
Hello Php

MB_CASE_TITLEを使うときの注意点

MB_CASE_TITLE を使うと、単語の先頭を大文字にできます。

$text = "hello php world";

echo mb_convert_case($text, MB_CASE_TITLE, 'UTF-8');

出力例:

Hello Php World

ただし、MB_CASE_TITLE はSEO記事のタイトルや英語見出しを自然な形に整えるための関数ではありません。

たとえば、以下のような文字列があるとします。

$title = "learn php and html";
echo mb_convert_case($title, MB_CASE_TITLE, 'UTF-8');

出力例:

Learn Php And Html

このように、PHPHTML のような略語も PhpHtml のように変換される可能性があります。

また、andofthe などを文法ルールに従って小文字にするわけでもありません。

そのため、記事タイトルや商品名を整形する場合は、必要に応じて例外処理を追加します。

$title = "learn php and html";

$title = mb_convert_case($title, MB_CASE_TITLE, 'UTF-8');
$title = str_replace(['Php', 'Html'], ['PHP', 'HTML'], $title);

echo $title;

出力結果:

Learn PHP And HTML

より自然なタイトルにしたい場合は、略語や固有名詞の辞書を用意して補正するのがおすすめです。

日本語サイトで大文字・小文字変換を行うときの注意点

日本語そのものには基本的に大文字・小文字の概念がない

日本語のひらがな、カタカナ、漢字には、英字のような大文字・小文字の概念は基本的にありません。

そのため、以下のような文字列に対して大文字・小文字変換を行っても、日本語部分は変化しません。

$text = "こんにちは PHP";

echo mb_strtoupper($text, 'UTF-8');

出力例:

こんにちは PHP

ただし、日本語サイトでは、英字や数字が混ざるケースがよくあります。

$text = "商品コードabc123";

このような文字列では、英字部分だけを変換することがあります。

$text = "商品コードabc123";

echo mb_strtoupper($text, 'UTF-8');

出力例:

商品コードABC123

全角英字の変換には注意する

日本語サイトでは、ユーザーが全角英字を入力することがあります。

PHP
ABC
Taro

このような全角英字は、大文字・小文字変換だけでは扱いづらい場合があります。

全角英数字を半角に変換したい場合は、mb_convert_kana() を使います。

$text = "ABC123";

echo mb_convert_kana($text, 'as', 'UTF-8');

出力結果:

ABC123

mb_convert_kana() の主なモードは以下です。

モード内容
a全角英数字などを半角へ変換
A半角英数字などを全角へ変換
r全角英字を半角へ変換
R半角英字を全角へ変換
n全角数字を半角へ変換
N半角数字を全角へ変換
s全角スペースを半角スペースへ変換
S半角スペースを全角スペースへ変換

たとえば、全角英数字と全角スペースを半角にそろえてから小文字化する場合は、以下のように書けます。

$input = " PHP Basic ";

// 全角英数字・全角スペースを半角へ変換
$input = mb_convert_kana($input, 'as', 'UTF-8');

// 前後の空白を削除
$input = trim($input);

// 小文字に変換
$input = mb_strtolower($input, 'UTF-8');

echo $input;

出力結果:

php basic

日本語フォームの入力値を正規化する場合は、mb_convert_kana()mb_strtolower() を組み合わせると便利です。

大文字・小文字変換で文字数が変わるケース

Unicode文字では変換後に文字数が変わることがある

英字の大文字・小文字変換では、基本的に1文字が1文字に変換されるイメージを持ちやすいです。

しかし、Unicode文字では、大文字・小文字変換によって文字数が変わる場合があります。

代表的な例が、ドイツ語の ß です。

$text = "Straße";

echo mb_strtoupper($text, 'UTF-8');

出力例:

STRASSE

このように、ßSS に変換される場合があります。

つまり、変換前は1文字だったものが、変換後に2文字になることがあります。

そのため、以下のような処理では注意が必要です。

  • 文字数制限をかける処理
  • 指定文字数で切り取る処理
  • 文字位置を使って処理するロジック
  • データベースのカラム長に合わせる処理
  • 表示幅を調整する処理

たとえば、文字数を制限したい場合は、変換前ではなく、変換後の文字列に対して長さを確認するほうが安全です。

$text = "Straße";

$upper = mb_strtoupper($text, 'UTF-8');

if (mb_strlen($upper, 'UTF-8') > 10) {
    echo "文字数が長すぎます";
}

メールアドレスを小文字に変換する場合

実務では小文字化されることが多い

Webサービスでは、メールアドレスを保存する前に小文字へ変換することがあります。

$email = "USER@example.COM";

$email = mb_strtolower($email, 'UTF-8');

echo $email;

出力結果:

user@example.com

ログインIDとしてメールアドレスを使う場合、表記ゆれを防ぐために小文字化する設計はよくあります。

たとえば、以下のようなメールアドレスを別ユーザーとして扱ってしまうと、重複登録やログイン時の混乱につながることがあります。

USER@example.com
user@example.com
User@example.com

そのため、多くのWebサービスでは、メールアドレスを小文字にそろえて保存・比較します。

厳密にはローカル部の扱いに注意する

ただし、メールアドレスを厳密に扱う場合は注意が必要です。

メールアドレスの @ より前の部分をローカル部、@ より後ろの部分をドメイン部と呼びます。

USER@example.com

この場合、

USER

がローカル部、

example.com

がドメイン部です。

一般的にドメイン部は大文字・小文字を区別しません。

一方で、ローカル部は仕様上、大文字・小文字を区別し得ます。

そのため、メール配送仕様を厳密に扱うシステムでは、メールアドレス全体を無条件に小文字化しないほうがよい場合があります。

慎重に処理するなら、ドメイン部だけ小文字化します。

$email = "USER@EXAMPLE.COM";

[$local, $domain] = explode('@', $email, 2);

$normalized = $local . '@' . mb_strtolower($domain, 'UTF-8');

echo $normalized;

出力結果:

USER@example.com

ただし、一般的な会員登録やログイン用途では、運用上のわかりやすさを優先して、メールアドレス全体を小文字化するケースも多いです。

重要なのは、システムの仕様として「メールアドレスの大文字・小文字をどう扱うか」を決めておくことです。

検索処理で大文字・小文字を無視する方法

小文字にそろえてから検索する

検索処理では、大文字・小文字を区別せずに比較したいことがあります。

たとえば、検索キーワードが PHP でも php でも同じ結果を返したい場合です。

そのような場合は、検索キーワードと検索対象の両方を小文字にそろえてから比較します。

$keyword = "PHP";
$title = "Learning php basics";

$keyword = mb_strtolower($keyword, 'UTF-8');
$title = mb_strtolower($title, 'UTF-8');

if (mb_strpos($title, $keyword, 0, 'UTF-8') !== false) {
    echo "見つかりました";
}

出力結果:

見つかりました

mb_strtolower() で小文字に統一し、mb_strpos() で文字列が含まれているかを判定しています。

mb_strpos() は、マルチバイト文字列に対応した文字列検索関数です。

日本語や多言語文字列を扱う場合は、通常の strpos() よりも mb_strpos() を使うほうが安全です。

mb_stripos()で大文字・小文字を無視して検索する

PHPには、大文字・小文字を無視して検索するための関数もあります。

マルチバイト文字列を扱う場合は、mb_stripos() を使えます。

$title = "Learning PHP Basics";
$keyword = "php";

if (mb_stripos($title, $keyword, 0, 'UTF-8') !== false) {
    echo "見つかりました";
}

出力結果:

見つかりました

mb_stripos() は、大文字・小文字を区別せずに文字列の位置を検索する関数です。

英数字だけを扱う場合は、stripos() でも対応できます。

$title = "Learning PHP Basics";
$keyword = "php";

if (stripos($title, $keyword) !== false) {
    echo "見つかりました";
}

ただし、多言語文字列を扱う可能性がある場合は、mb_stripos() を使うほうが安全です。

URLスラッグやファイル名を小文字に変換する方法

URLスラッグを小文字にそろえる

Web制作では、記事タイトルや商品名からURLスラッグを作ることがあります。

URLスラッグでは、小文字に統一することがよくあります。

$title = "PHP Basic Tutorial";

$slug = mb_strtolower($title, 'UTF-8');
$slug = str_replace(' ', '-', $slug);

echo $slug;

出力結果:

php-basic-tutorial

より実務的には、前後の空白や連続する空白も処理します。

$title = " PHP   Basic   Tutorial ";

$slug = trim($title);
$slug = mb_strtolower($slug, 'UTF-8');
$slug = preg_replace('/\s+/', '-', $slug);

echo $slug;

出力結果:

php-basic-tutorial

ただし、実際のURLスラッグ生成では、記号の削除、全角文字の扱い、重複ハイフンの整理、URLエンコードなども考慮する必要があります。

日本語を含むスラッグでは追加処理が必要

日本語タイトルからスラッグを作る場合は、単純な小文字化だけでは不十分です。

$title = "PHP入門 基本チュートリアル";

$slug = mb_strtolower($title, 'UTF-8');
$slug = preg_replace('/\s+/', '-', trim($slug));

echo $slug;

出力例:

php入門-基本チュートリアル

このように、日本語をそのままURLに含める設計もあります。

一方で、英数字のみのスラッグにしたい場合は、ローマ字変換や別途スラッグ用の文字列を用意する必要があります。

WordPressなどのCMSでは、日本語スラッグをそのまま使うか、英数字のスラッグを手動で設定することも多いです。

PHPで大文字・小文字変換を行う実務例

ユーザー入力を正規化する

フォーム入力では、ユーザーが大文字・小文字、全角・半角を混ぜて入力することがあります。

検索用キーワードやIDの比較などでは、表記ゆれを減らすために正規化します。

$input = " PHP Basic ";

// 全角英数字・全角スペースを半角へ
$input = mb_convert_kana($input, 'as', 'UTF-8');

// 前後の空白を削除
$input = trim($input);

// 小文字へ変換
$input = mb_strtolower($input, 'UTF-8');

echo $input;

出力結果:

php basic

このように処理すると、以下のような入力の違いを吸収しやすくなります。

PHP
PHP
Php
php

商品コードや管理コードを大文字に統一する

商品コード、会員コード、クーポンコードなどは、大文字に統一することがあります。

$code = "abc-123";

$code = mb_strtoupper($code, 'UTF-8');

echo $code;

出力結果:

ABC-123

大文字に統一しておくと、ユーザーが小文字で入力しても同じコードとして扱いやすくなります。

$inputCode = "abc-123";
$registeredCode = "ABC-123";

$inputCode = mb_strtoupper($inputCode, 'UTF-8');

if ($inputCode === $registeredCode) {
    echo "コードが一致しました";
}

出力結果:

コードが一致しました

表示名を整形する

名前やラベルを表示用に整形する場合、ucwords()mb_convert_case() を使うことがあります。

$name = "taro yamada";

echo ucwords($name);

出力結果:

Taro Yamada

マルチバイト対応を意識するなら、mb_convert_case() を使います。

$name = "taro yamada";

echo mb_convert_case($name, MB_CASE_TITLE, 'UTF-8');

出力結果:

Taro Yamada

ただし、名前や固有名詞には例外が多いため、自動変換だけで完全に正しい表示になるとは限りません。

たとえば、macdonaldo'connorvan gogh のような名前は、単純なタイトルケースでは不自然になることがあります。

PHPの大文字・小文字変換でよく使う関数一覧

基本的な変換関数

関数内容使用例
strtolower()ASCII英字を小文字に変換するHELLOhello
strtoupper()ASCII英字を大文字に変換するhelloHELLO
ucfirst()先頭1文字を大文字にするhelloHello
lcfirst()先頭1文字を小文字にするHellohello
ucwords()各単語の先頭を大文字にするhello worldHello World

マルチバイト対応の変換関数

関数内容使用例
mb_strtolower()マルチバイト対応で小文字に変換するCAFÉcafé
mb_strtoupper()マルチバイト対応で大文字に変換するcaféCAFÉ
mb_convert_case()指定モードで大文字・小文字を変換するhello worldHello World
mb_convert_kana()全角・半角などを変換するABCABC

PHPで大文字・小文字変換を使い分けるポイント

英数字だけなら通常の文字列関数でよい

ASCII英字だけを扱う処理であれば、以下の関数で十分です。

strtolower()
strtoupper()
ucfirst()
lcfirst()
ucwords()

たとえば、固定された英語のコードや簡単な文字列であれば、通常の文字列関数を使っても問題ありません。

$text = "HELLO";

echo strtolower($text);

出力結果:

hello

日本語サイト・多言語サイトではmb_系を使う

日本語サイトや多言語サイトでは、基本的に mb_ 系の関数を使うのがおすすめです。

mb_strtolower()
mb_strtoupper()
mb_convert_case()
mb_strpos()
mb_stripos()
mb_strlen()

特に、ユーザーが入力する文字列を処理する場合は、どのような文字が含まれるかわかりません。

そのため、最初からマルチバイト対応の関数を使っておくと安全です。

$input = "CAFÉ PHP";

$lower = mb_strtolower($input, 'UTF-8');

echo $lower;

出力例:

café php

全角・半角変換はmb_convert_kana()を使う

大文字・小文字変換と全角・半角変換は別の処理です。

たとえば、以下の文字列を考えます。

ABC123

これを以下のようにしたい場合、

ABC123

大文字・小文字変換ではなく、全角・半角変換が必要です。

この場合は mb_convert_kana() を使います。

$text = "ABC123";

echo mb_convert_kana($text, 'as', 'UTF-8');

出力結果:

ABC123

その後、小文字にしたい場合は mb_strtolower() を組み合わせます。

$text = "ABC123";

$text = mb_convert_kana($text, 'as', 'UTF-8');
$text = mb_strtolower($text, 'UTF-8');

echo $text;

出力結果:

abc123

まとめ

PHPで大文字・小文字を変換する場合、英数字だけを扱うのか、日本語や多言語文字列を扱うのかによって使う関数が変わります。

ASCII英字だけであれば、以下の関数が使えます。

strtolower($text);
strtoupper($text);
ucfirst($text);
lcfirst($text);
ucwords($text);

日本語サイトや多言語サイトでは、以下のようなマルチバイト対応関数を使うのがおすすめです。

mb_strtolower($text, 'UTF-8');
mb_strtoupper($text, 'UTF-8');
mb_convert_case($text, MB_CASE_TITLE, 'UTF-8');

また、全角英数字を半角にしたい場合は、大文字・小文字変換ではなく mb_convert_kana() を使います。

$text = mb_convert_kana($text, 'as', 'UTF-8');

実務では、以下のように処理するケースが多いです。

$input = " PHP Basic ";

$input = mb_convert_kana($input, 'as', 'UTF-8');
$input = trim($input);
$input = mb_strtolower($input, 'UTF-8');

echo $input;

出力結果:

php basic

PHPで大文字・小文字変換を行うときは、単純に strtolower()strtoupper() を使うだけでなく、文字コード、マルチバイト文字、全角・半角、検索や保存時の正規化まで意識すると、より安全で実務的なコードになります。

以上、PHPでの大文字・小文字の変換についてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次