PHP でフォームデータをカタカナ入力チェックする方法

はじめに

実務にて、フォームデータを全角・半角カタカナ入力チェックするバリデーション(入力値の検証)を実装する作業があり、それを解決した情報になります。Web 開発の初心者、初学者の方にもわかりやすいように、ソースコードを編集してサンプルを公開しています、ご参考になれば幸いです。

検証環境

サンプル

解説

サンプルのソースコードを基に、基本的な PCRE 正規表現構文 を用いて説明します。

全角カタカナのチェック

片仮名の Unicode には、ブロック が定義されています。

よく見る [ァ-ヶー] は、ブロックの (30A1) から (30F6) までの一部と (30FC) です。(30F4)、(30F5)、(30F6)、(30F7) などの文字とマッチしないので、理解しないでコピペをしている場合は、使い所に気を付けましょう。

ブロック全部を含めるには、下記のように preg_match でチェックします。

function checkFullWidthKatakana(string $str): int|false {
  return preg_match("/\A[ァ-ヿ]+\z/u", $str);
}

下記の PCRE 正規表現構文を記述しています。

下記の文字列とマッチします。

ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ

u が無いと (30C0) とマッチしない場合があるので注意しましょう。

(30F5) と (30F6) を含めない場合は、下記のようにチェックします。

function checkFullWidthKatakana(string $str): int|false {
  return preg_match("/\A[ァ-ヴヷ-ヿ]+\z/u", $str);
}

また、^[...]$ という書き方は 修飾子 の m を指定している場合に、改行の有無によって下記のように動作が変わります。

$str = 'カタ
カナ';

var_dump(preg_match("/\A[ァ-ヴー]+\z/u", $str)); // マッチしない int(0)
var_dump(preg_match("/\A[ァ-ヴー]+\z/mu", $str)); // マッチしない int(0)
var_dump(preg_match("/^[ァ-ヴー]+$/u", $str)); // マッチしない int(0)
var_dump(preg_match("/^[ァ-ヴー]+$/mu", $str)); // マッチする int(1)

動作が統一されている \A[...]\z を指定するのが無難かと思います。

半角カタカナのチェック

半角カタカナの Unicode(FF66) から (FF9F) にあります。

下記のように preg_match でチェックします。

function checkHalfWidthKatakana(string $str): int|false {
  return preg_match("/\A[ヲ-゚]+\z/u", $str);
}

下記の PCRE 正規表現構文を記述しています。

  • /:デリミタ
  • \A:エスケープシーケンス 検索対象文字列の始端
  • [ヲ-゚]Unicode F000-FFFF(FF66) から (FF9F) まで
  • +:量指定子 {1,} と同じ 直前の表現を 1 回以上繰り返す
  • \z:エスケープシーケンス 検索対象文字列の終端
  • u:修飾子 UTF-8 として処理する

下記の文字列とマッチします。

ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚

(FF65) を含める場合は、下記のようにチェックします。

function checkHalfWidthKatakana(string $str): int|false {
  return preg_match("/\A[・-゚]+\z/u", $str);
}

全角・半角カタカナのチェック

下記のように全角カタカナと半角カタカナの正規表現を組み合わせます。

function checkKatakana(string $str): int|false {
  return preg_match("/\A[ァ-ヿヲ-゚]+\z/u", $str);
}

下記の文字列とマッチします。

ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴーヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙゚

実は、もっと簡単なやり方があります。

Unicode 文字プロパティ\p{Katakana} で、下記のようにチェックする方法です。

function checkKatakana(string $str): int|false {
  return preg_match("/\A\p{Katakana}+\z/u", $str);
}

\p{Katakana} の文字範囲は下記になります。

  • (30A1) から (30FA) まで
  • (30FD) から (30FF) まで
  • (31F0) から (31FF) まで
  • (32D0) から (32FE) まで
  • (3300) から (3357) まで
  • (FF66) から (FF6F) まで
  • (FF71) から (FF9D) まで
  • や行え (1B000)
  • 小書きヰ (1B164) から 小書きン (1B167) まで

下記の文字列とマッチします。

ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺヽヾヿㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ㋐㋑㋒㋓㋔㋕㋖㋗㋘㋙㋚㋛㋜㋝㋞㋟㋠㋡㋢㋣㋤㋥㋦㋧㋨㋩㋪㋫㋬㋭㋮㋯㋰㋱㋲㋳㋴㋵㋶㋷㋸㋹㋺㋻㋼㋽㋾㌀㌁㌂㌃㌄㌅㌆㌇㌈㌉㌊㌋㌌㌍㌎㌏㌐㌑㌒㌓㌔㌕㌖㌗㌘㌙㌚㌛㌜㌝㌞㌟㌠㌡㌢㌣㌤㌥㌦㌧㌨㌩㌪㌫㌬㌭㌮㌯㌰㌱㌲㌳㌴㌵㌶㌷㌸㌹㌺㌻㌼㌽㌾㌿㍀㍁㍂㍃㍄㍅㍆㍇㍈㍉㍊㍋㍌㍍㍎㍏㍐㍑㍒㍓㍔㍕㍖㍗ヲァィゥェォャュョッアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン𛀀𛅤𛅥𛅦𛅧

(30FC) と 濁点半濁点 ゙(3099) から (309C) までが含まれていないことに気を付けましょう。

(30FC) を含めたい場合は、下記のようにチェックします。

function checkKatakana(string $str): int|false {
  return preg_match("/\A[\p{Katakana}ー]+\z/u", $str);
}

まとめ

基本的に /\A[\p{Katakana}ー]+\z/u でチェックして、絞り込みが必要な場合は、Unicode 一覧表 を確認しながら正規表現を書き換えて柔軟に対応すれば良いと思います。

以上です。

おわりに

サンプルのソースコードを再利用する際は、関わっている案件で用いられる文字セットの範囲を調査してから利用していただけると幸いです。