結論
簡易的には、PCRE 関数 の preg_match を利用して正規表現のマッチングによるバリデーションを実装します。
第一引数の pattern には、PCRE 正規表現構文 の Unicode 文字プロパティ である\p{Hiragana}
とー
(U+30FC) を指定します。
function checkHiragana(string $str): int|false {
return preg_match("/\A[\p{Hiragana}ー]+\z/u", $str);
}
マッチする範囲は下記になります。
ぁ
(U+3041) –ゟ
(U+309F) : Hiragana- U+1B001 – U+1B0FF : Kana Supplement
- U+1B100 – U+1B11F : Kana Extended-A
- U+1B150 – U+1B152 : Small Kana Extension
- U+1F200 : Enclosed Ideographic Supplement
ー
(U+30FC) : Katakana
u
を記述しないと む
(U+3080) とマッチしないことがあるのでご注意下さい。
文字で範囲を指定する場合、例えば、Hiragana +ー
(U+30FC) は下記のようになります。
function checkHiragana(string $str): int|false {
return preg_match("/\A[ぁ-ゟー]+\z/u", $str);
}
マッチする範囲は下記になります。
pattern は要件に合わせて、柔軟に書き換えて対応すれば良いでしょう。
環境
- MAMP 6.8
- Apache 2.4.54
- PHP 8.2.0
解説
初めに、Unicode Block を理解する必要があります。
Unicode とは、簡単に言うと Unicode Consortium という非営利団体によって維持されている世界中の文字や記号を 1 つの文字コード体系で扱える様に作られた符号化文字集合のことです。
Unicode Block とは、Code point の連続する範囲のことです。
Code point とは、特定の文字にマップされる数値のことです。
例えば、Unicode は 0 hex – 10FFFF hex の数値です。
仕様
平仮名の Unicode Block は、下表の通り U+3040 〜 U+309F の 96 個(内 3 個の保留)になります。
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | B | C | D | E | F | ||
U+304x | ぁ | あ | ぃ | い | ぅ | う | ぇ | え | ぉ | お | か | が | き | ぎ | く | |
U+305x | ぐ | け | げ | こ | ご | さ | ざ | し | じ | す | ず | せ | ぜ | そ | ぞ | た |
U+306x | だ | ち | ぢ | っ | つ | づ | て | で | と | ど | な | に | ぬ | ね | の | は |
U+307x | ば | ぱ | ひ | び | ぴ | ふ | ぶ | ぷ | へ | べ | ぺ | ほ | ぼ | ぽ | ま | み |
U+308x | む | め | も | ゃ | や | ゅ | ゆ | ょ | よ | ら | り | る | れ | ろ | ゎ | わ |
U+309x | ゐ | ゑ | を | ん | ゔ | ゕ | ゖ | ゙ | ゚ | ゛ | ゜ | ゝ | ゞ | ゟ |
実装
PCRE 関数 の preg_match を利用して正規表現のマッチングによるバリデーションを実装します。
第一引数の pattern には、PCRE 正規表現構文 の Unicode 文字プロパティ である\p{Hiragana}
とー
(U+30FC) を指定します。
function checkHiragana(string $str): int|false {
return preg_match("/\A[\p{Hiragana}ー]+\z/u", $str);
}
記述している PCRE 正規表現構文 の説明になります。
/
: デリミタ\A
: エスケープシーケンス 検索対象文字列の始端[]
: 文字クラス\p{Hiragana}
: マッチする範囲は下記になります。ぁ
(U+3041) –ゟ
(U+309F) : Hiragana- U+1B001 – U+1B0FF : Kana Supplement
- U+1B100 – U+1B11F : Kana Extended-A
- U+1B150 – U+1B152 : Small Kana Extension
- U+1F200 : Enclosed Ideographic Supplement
ー
: Katakana+
: 量指定子{1,}
と同じ 直前の表現を 1 回以上繰り返す\z
: エスケープシーケンス 検索対象文字列の終端u
: 修飾子 UTF-8 として処理する
u
が無いとむ
(U+3080) とマッチしないことがあることにご注意下さい。
文字で範囲を指定する場合、例えば、Hiragana +ー
(U+30FC) は下記のようになります。
function checkHiragana(string $str): int|false {
return preg_match("/\A[ぁ-ゟー]+\z/u", $str);
}
記述している PCRE 正規表現構文 の説明になります。
/
: デリミタ\A
: エスケープシーケンス 検索対象文字列の始端[]
: 文字クラスぁ-ゟ
: Hiraganaー
: Katakana+
: 量指定子{1,}
と同じ 直前の表現を 1 回以上繰り返す\z
: エスケープシーケンス 検索対象文字列の終端u
: 修飾子 UTF-8 として処理する
因みに、^[...]$
という書き方は 修飾子 のm
を指定している場合、改行の有無によって動作が変わるので、特別な事情が無い限りは動作が統一されている\A[...]\z
を指定するのが無難と思われます。
$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)
pattern は要件に合わせて、柔軟に書き換えて対応すれば良いでしょう。
検証
検証用の簡単なプログラムを書きました。
<?php
$hiragana = $_POST['hiragana'] ?? '';
$hiragana_2 = $_POST['hiragana2'] ?? '';
if ($hiragana) {
if (checkHiragana($hiragana)) echo '<p>pattern 1 : OK</p>';
else echo '<p>pattern 1 : NG</p>';
}
if ($hiragana_2) {
if (checkHiragana2($hiragana_2)) echo '<p>pattern 2 : OK</p>';
else echo '<p>pattern 2 : NG</p>';
}
function checkHiragana(string $str): int|false {
return preg_match("/\A[\p{Hiragana}ー]+\z/u", $str);
}
function checkHiragana2(string $str): int|false {
return preg_match("/\A[ぁ-ゟー]+\z/u", $str);
}
?>
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
</head>
<body>
<hr>
<form method="post">
<p>
平仮名(Unicode 文字プロパティ): <input type="text" name="hiragana">
</p>
<p>
平仮名(正規表現): <input type="text" name="hiragana2">
</p>
<input type="submit" value="送信する">
</form>
</body>
</html>
平仮名(Unicode 文字プロパティ)
下記の文字列とマッチします。
ぁあぃいぅうぇえぉおかがきぎく
ぐけげこごさざしじすずせぜそぞた
だちぢっつづてでとどなにぬねのは
ばぱひびぴふぶぷへべぺほぼぽまみ
むめもゃやゅゆょよらりるれろゎわ
ゐゑをんゔゕゖ゛゜ゝゞゟー
平仮名(正規表現)
下記の文字列とマッチします。
ぁあぃいぅうぇえぉおかがきぎく
ぐけげこごさざしじすずせぜそぞた
だちぢっつづてでとどなにぬねのは
ばぱひびぴふぶぷへべぺほぼぽまみ
むめもゃやゅゆょよらりるれろゎわ
ゐゑをんゔゕゖ゛゜ゝゞゟー