はじめに
実務にて、フォームデータをひらがな入力チェックするバリデーション(入力値の検証)を実装する作業があり、それを解決した情報になります。Web 開発の初心者、初学者の方にもわかりやすいように、ソースコードを編集してサンプルを公開しています、ご参考になれば幸いです。
検証環境
サンプル
解説
サンプルのソースコードを基に、基本的な PCRE 正規表現構文 を用いて説明します。
ひらがなのチェック
平仮名の Unicode には、ブロック が定義されています。
よく見る [ぁ-んー]
という書き方は、ブロックの ぁ
(3042) から ん
(3093) までの一部と ー
(30FC) です。ゔ
(3094)、ゕ
(3095)、ゖ
(3096) などの文字とマッチしないので、理解しないでコピペをしている場合は、使い所に気を付けましょう。
ブロック全部と ー
(30FC) を含めるには、下記のように preg_match でチェックします。
function checkHiragana(string $str): int|false {
return preg_match("/\A[ぁ-ゟー]+\z/u", $str);
}
下記の PCRE 正規表現構文を記述しています。
/
:デリミタ\A
:エスケープシーケンス 検索対象文字列の始端[]
: 文字クラス[ぁ-ゟー]
:Unicode 3000-3FFF のぁ
(3041) からゟ
(309F) までとー
(30FC)+
:量指定子{1,}
と同じ 直前の表現を 1 回以上繰り返す\z
:エスケープシーケンス 検索対象文字列の終端u
:修飾子 UTF-8 として処理する
u
が無いと む
とマッチしないことがあるので気を付けましょう。
下記の文字列とマッチします。
ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖゝゞゟ
ゕ
(3095) と ゖ
(3096) を含めない場合は、下記のようにチェックします。
function checkHiragana(string $str): int|false {
return preg_match("/\A[ぁ-ゔゝ-ゟー]+\z/u", $str);
}
実は、もっと簡単なやり方があります。
Unicode 文字プロパティ の \p{Hiragana}
で、下記のようにチェックする方法です。
function checkHiragana2(string $str): int|false {
return preg_match("/\A\p{Hiragana}+\z/u", $str);
}
\p{Hiragana}
の文字範囲は下記になります。
ぁ
(3041) からゖ
(3096) までゝ
(309D) からゟ
(309F) まで- や行え(1B001) から
𛄞
(1B11E) まで - 小書きヰ(1B150) から 小書きヲ(1B152) まで
🈀
(1F200)
濁点・半濁点の ゙
(3099) から ゜
(309C) までが含まれていないことに気を付けましょう。
下記の文字列とマッチします。
ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖゝゞゟ𛀁𛀂𛀃𛀄𛀅𛀆𛀇𛀈𛀉𛀊𛀋𛀌𛀍𛀎𛀏𛀐𛀑𛀒𛀓𛀔𛀕𛀖𛀗𛀘𛀙𛀚𛀛𛀜𛀝𛀞𛀟𛀠𛀡𛀢𛀣𛀤𛀥𛀦𛀧𛀨𛀩𛀪𛀫𛀬𛀭𛀮𛀯𛀰𛀱𛀲𛀳𛀴𛀵𛀶𛀷𛀸𛀹𛀺𛀻𛀼𛀽𛀾𛀿𛁀𛁁𛁂𛁃𛁄𛁅𛁆𛁇𛁈𛁉𛁊𛁋𛁌𛁍𛁎𛁏𛁐𛁑𛁒𛁓𛁔𛁕𛁖𛁗𛁘𛁙𛁚𛁛𛁜𛁝𛁞𛁟𛁠𛁡𛁢𛁣𛁤𛁥𛁦𛁧𛁨𛁩𛁪𛁫𛁬𛁭𛁮𛁯𛁰𛁱𛁲𛁳𛁴𛁵𛁶𛁷𛁸𛁹𛁺𛁻𛁼𛁽𛁾𛁿𛂀𛂁𛂂𛂃𛂄𛂅𛂆𛂇𛂈𛂉𛂊𛂋𛂌𛂍𛂎𛂏𛂐𛂑𛂒𛂓𛂔𛂕𛂖𛂗𛂘𛂙𛂚𛂛𛂜𛂝𛂞𛂟𛂠𛂡𛂢𛂣𛂤𛂥𛂦𛂧𛂨𛂩𛂪𛂫𛂬𛂭𛂮𛂯𛂰𛂱𛂲𛂳𛂴𛂵𛂶𛂷𛂸𛂹𛂺𛂻𛂼𛂽𛂾𛂿𛃀𛃁𛃂𛃃𛃄𛃅𛃆𛃇𛃈𛃉𛃊𛃋𛃌𛃍𛃎𛃏𛃐𛃑𛃒𛃓𛃔𛃕𛃖𛃗𛃘𛃙𛃚𛃛𛃜𛃝𛃞𛃟𛃠𛃡𛃢𛃣𛃤𛃥𛃦𛃧𛃨𛃩𛃪𛃫𛃬𛃭𛃮𛃯𛃰𛃱𛃲𛃳𛃴𛃵𛃶𛃷𛃸𛃹𛃺𛃻𛃼𛃽𛃾𛃿𛄀𛄁𛄂𛄃𛄄𛄅𛄆𛄇𛄈𛄉𛄊𛄋𛄌𛄍𛄎𛄏𛄐𛄑𛄒𛄓𛄔𛄕𛄖𛄗𛄘𛄙𛄚𛄛𛄜𛄝𛄞𛅐𛅑𛅒🈀
ー
(30FC) を含めたい場合は、下記のように指定します。
function checkHiragana(string $str): int|false {
return preg_match("/\A[\p{Hiragana}ー]+\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
を指定するのが無難かと思います。
まとめ
基本的に /\A[\p{Hiragana}ー]+\z/u
でチェックして、絞り込みが必要な場合は、Unicode 一覧表 を確認しながら正規表現を書き換えて柔軟に対応すれば良いと思います。
以上です。
おわりに
サンプルのソースコードを再利用する際は、関わっている案件で用いられる文字セットの範囲を調査してからご利用ください。