PHPで全角文字を半角文字に変換する方法について

採用はこちら

PHPで全角文字を半角文字に変換する場合は、主に mb_convert_kana() 関数を使用します。
mb_convert_kana() は、英字・数字・スペース・カタカナなどの全角・半角を変換できるPHPの関数です。

たとえば、ユーザーがフォームに「12345」のような全角数字を入力した場合でも、mb_convert_kana() を使えば「12345」という半角数字に統一できます。

ただし、mb_convert_kana() はすべてのUnicode文字を半角に変換する関数ではありません。
変換できる文字の種類やオプションを理解したうえで使用することが重要です。

目次

mb_convert_kana()とは

mb_convert_kana() は、PHPの mbstring 拡張で提供されている関数です。
主に日本語の文字列に含まれる全角・半角表記を変換するために使用します。

基本的な構文は次のとおりです。

mb_convert_kana(
    string $string,
    string $mode = "KV",
    ?string $encoding = null
): string

主な引数は以下のとおりです。

  • $string:変換対象となる文字列
  • $mode:どの文字をどの方向へ変換するか指定するモード
  • $encoding:文字エンコーディング

WebアプリケーションでUTF-8を使用している場合は、次のように明示しておくと処理内容が分かりやすくなります。

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

PHPで全角英数字を半角に変換する方法

全角数字を半角数字に変換する

全角数字を半角数字に変換する場合は、n オプションを使用します。

$text = '12345';

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

echo $result;

実行結果は次のとおりです。

12345

電話番号や郵便番号、年齢、数量など、数字が入力されるフォームの値を正規化するときに便利です。

全角英字を半角英字に変換する

全角英字だけを半角に変換したい場合は、r を指定します。

$text = 'ABCabc';

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

echo $result;

実行結果は次のようになります。

ABCabc

この場合、数字やカタカナなどは変換対象になりません。

全角英数字や一部の記号を半角に変換する

英数字などをまとめて半角に変換する場合は、a を使用できます。

$text = 'PHP2026';

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

echo $result;

実行結果は以下です。

PHP2026

a は単純に英字と数字だけを変換するわけではなく、一部の記号も変換対象になります。

そのため、「全角英数字を半角に変換するオプション」と覚えるだけでなく、英数字や一部記号をまとめて変換するためのオプションと理解しておくとよいでしょう。

全角スペースを半角スペースに変換する方法

sオプションを使用する

全角スペースを半角スペースに変換する場合は、s を使用します。

$text = 'PHP プログラミング';

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

echo $result;

変換前は、「PHP」と「プログラミング」の間に全角スペースが入っています。

変換後は次のようになります。

PHP プログラミング

検索キーワードやユーザー入力を正規化するときなどに便利です。

全角カタカナを半角カタカナに変換する方法

kオプションを使用する

全角カタカナを半角カタカナへ変換する場合は、k を指定します。

$text = 'カタカナ';

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

echo $result;

実行結果は以下です。

カタカナ

ただし、現在のWebサイトやWebアプリケーションでは、カタカナを必ず半角にする必要があるとは限りません。

氏名のフリガナや住所などでは、全角カタカナに統一する設計も一般的です。
システムの入力ルールに合わせて変換方向を決めることが重要です。

半角カタカナを全角カタカナに変換する方法

KとVを組み合わせる

半角カタカナを全角カタカナへ変換する場合は、K を使用します。

さらに濁点や半濁点を適切に1文字へまとめたい場合は、V を組み合わせる方法があります。

$text = 'パピプペポ';

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

echo $result;

このように KV を指定すると、半角カタカナを全角へ変換しながら、濁点や半濁点を含む文字も適切に処理できます。

ユーザーから入力されたフリガナを全角カタカナへ統一したい場合などに便利です。

mb_convert_kana()の主なオプション

全角・半角変換で使用するオプション一覧

mb_convert_kana() では、変換したい文字の種類によってオプションを指定します。

主なオプションは次のとおりです。

オプション変換内容
r全角英字を半角英字へ変換
R半角英字を全角英字へ変換
n全角数字を半角数字へ変換
N半角数字を全角数字へ変換
a全角英数字や一部記号を半角へ変換
A半角英数字や一部記号を全角へ変換
s全角スペースを半角スペースへ変換
S半角スペースを全角スペースへ変換
k全角カタカナを半角カタカナへ変換
K半角カタカナを全角カタカナへ変換
h全角ひらがなを半角カタカナへ変換
H半角カタカナを全角ひらがなへ変換
c全角カタカナを全角ひらがなへ変換
C全角ひらがなを全角カタカナへ変換
V濁点・半濁点付き文字を1文字にまとめる

大文字と小文字によって変換方向が逆になるオプションが多いため、指定を間違えないよう注意しましょう。

複数の文字種をまとめて半角に変換する方法

オプションを組み合わせる

mb_convert_kana() のモードは、複数組み合わせて使用できます。

たとえば、全角英数字と全角スペースをまとめて半角に変換する場合は as を指定します。

$text = 'PHP 123';

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

echo $result;

実行結果は以下です。

PHP 123

全角カタカナも半角へ変換したい場合は、さらに k を追加できます。

$text = 'PHP 123 カタカナ';

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

echo $result;

結果は次のようになります。

PHP 123 カタカナ

矛盾するオプションには注意する

オプションを組み合わせられるからといって、すべての組み合わせが有効とは限りません。

たとえば、

mb_convert_kana($text, 'sS', 'UTF-8');

のように、全角スペースを半角へ変換する s と、半角スペースを全角へ変換する S を同時に指定すると、変換方向が矛盾します。

PHP 8.2以降では、このような無効なモード指定によって ValueError が発生する場合があります。

同じ文字種について、相反する変換オプションを同時に指定しないよう注意しましょう。

Webフォームの全角数字を半角に統一する方法

入力値をmb_convert_kana()で正規化する

Webフォームでは、ユーザーが数字を全角で入力することがあります。

たとえば年齢として、

25

と入力されるケースです。

次のように変換できます。

$age = $_POST['age'] ?? '';

$age = mb_convert_kana($age, 'n', 'UTF-8');

echo $age;

変換後は、

25

となります。

正規化とバリデーションは別に行う

重要なのは、半角に変換しただけでは入力値が正しいとは限らないことです。

たとえば、

999999

という値も数字としては変換できますが、年齢として適切とはいえません。

そのため、文字列を正規化したあとにバリデーションを行います。

$age = $_POST['age'] ?? '';

$age = mb_convert_kana($age, 'n', 'UTF-8');

$age = filter_var(
    $age,
    FILTER_VALIDATE_INT,
    [
        'options' => [
            'min_range' => 0,
            'max_range' => 150,
        ],
    ]
);

if ($age !== false) {
    echo '正しい年齢です';
}

このように、

正規化
↓
バリデーション

という順番で処理すると分かりやすくなります。

電話番号を全角から半角に変換する方法

数字を半角へ統一する

電話番号も全角数字で入力される可能性があります。

$tel = '09012345678';

$tel = mb_convert_kana($tel, 'n', 'UTF-8');

echo $tel;

実行結果は以下です。

09012345678

電話番号は文字列として扱う

電話番号を扱う場合に注意したいのが、整数型へ変換しないことです。

たとえば、

09012345678

の先頭の 0 は電話番号として重要です。

数値として扱うと、処理方法によっては先頭の 0 が失われる可能性があります。

そのため電話番号や郵便番号、会員番号、商品コードなどは、数字だけで構成されていても基本的には文字列として扱うとよいでしょう。

str_replace()で特定の文字だけ変換する方法

独自の変換ルールを作成する

特定の文字だけを変換したい場合は、str_replace() を利用する方法もあります。

たとえば全角数字を個別に置換する場合は、次のように記述できます。

$zenkaku = [
    '0', '1', '2', '3', '4',
    '5', '6', '7', '8', '9'
];

$hankaku = [
    '0', '1', '2', '3', '4',
    '5', '6', '7', '8', '9'
];

$text = '12345';

$result = str_replace($zenkaku, $hankaku, $text);

echo $result;

結果は次のとおりです。

12345

一般的な全角・半角変換であれば mb_convert_kana() のほうが簡潔ですが、独自の変換ルールを定義したい場合には str_replace() が便利です。

たとえば、

① → 1
㈱ → 株式会社
特定の記号 → 別の記号

といった処理です。

これらは厳密には全角・半角変換ではなく、アプリケーション独自の文字列正規化として考えるとよいでしょう。

Unicode正規化で文字を統一する方法

Normalizerを使用する

PHPの intl 拡張が利用できる環境では、Normalizer クラスを使ってUnicode正規化を行うこともできます。

$text = 'PHP123';

$normalized = Normalizer::normalize(
    $text,
    Normalizer::FORM_KC
);

echo $normalized;

Normalizer::FORM_KC はNFKCと呼ばれるUnicode正規化方式です。

NFKCを適用すると、一部の全角英数字などがASCII文字へ正規化されることがあります。

mb_convert_kana()とNormalizerは目的が異なる

ただし、Normalizermb_convert_kana() は同じ目的の関数ではありません。

mb_convert_kana() は、

全角数字 → 半角数字
全角英字 → 半角英字
半角カナ → 全角カナ

のように、変換対象を比較的明確に指定できます。

一方、NFKCはUnicodeの互換文字を含めて正規化するため、全角・半角以外の文字表現も変化する可能性があります。

そのため、

「入力された全角数字だけを半角にしたい」

という用途であれば、

mb_convert_kana($text, 'n', 'UTF-8');

のように目的に合ったモードを指定するほうが処理の意図を明確にできます。

mb_convert_kana()を使用するときの注意点

mbstring拡張が必要

mb_convert_kana()mbstring 拡張の関数です。

利用できるか確認する場合は、次のように記述できます。

if (function_exists('mb_convert_kana')) {
    echo 'mb_convert_kana()を利用できます';
}

mbstring拡張そのものが読み込まれているか確認したい場合は、extension_loaded() も利用できます。

if (extension_loaded('mbstring')) {
    echo 'mbstringを利用できます';
}

文字エンコーディングを確認する

第3引数の文字エンコーディングを省略した場合は、PHPの内部文字エンコーディングが使用されます。

UTF-8で処理しているWebアプリケーションであれば、

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

のように明示すると、コードの意図が分かりやすくなります。

すべての全角文字が半角になるわけではない

mb_convert_kana() は、あらゆる全角文字を半角へ変換する関数ではありません。

たとえば、

漢字
ひらがな
絵文字

などをASCII文字へ変換することはできません。

mb_convert_kana() は、英数字・スペース・カナなど、モードで定義された文字種を変換するための関数です。

「すべての全角文字を半角化できる」と誤解しないよう注意しましょう。

PHPで全角文字を半角に変換するときの使い分け

数字だけならnを使用する

数字だけを半角に統一する場合は、次のように n を指定します。

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

電話番号、郵便番号、数量などに適しています。

英字だけならrを使用する

英字だけを半角にする場合は r を使用します。

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

英数字や一部記号ならaを使用する

英数字などをまとめて半角へ統一したい場合は a が便利です。

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

スペースも変換するならasを使用する

英数字などに加えて全角スペースも半角にしたい場合は、次のようにします。

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

Webフォームや検索キーワードの正規化で使いやすい指定です。

PHPの全角・半角変換では目的に合った方法を選ぶ

PHPで全角文字を半角文字へ変換する場合は、基本的に mb_convert_kana() が便利です。

数字だけを変換する場合は n、英字だけなら r、英数字や一部記号をまとめて変換する場合は a、全角スペースなら s というように、変換対象を細かく指定できます。

たとえば、英数字とスペースをまとめて半角へ統一する場合は、次のように記述できます。

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

一方、独自の文字変換が必要な場合は str_replace()、Unicode全体の正規化が必要な場合は Normalizer を検討できます。

また、Webフォームでは全角・半角を統一するだけでなく、正規化後に適切なバリデーションを行うことも重要です。

「どの文字をどの形式へ統一したいのか」を明確にし、mb_convert_kana() のモードを適切に使い分けることが、PHPで安全かつ扱いやすい文字列処理を行うポイントです。

以上、PHPで全角文字を半角文字に変換する方法についてでした。

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

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