PHP で片仮名(カタカナ)のバリデーションを作る

目次

結論

全角

PCRE 関数 の preg_match を利用して正規表現のマッチングによるバリデーションを実装します。

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

マッチする範囲は下記になります。

  1. (U+30A0) – (U+30FF) : Katakana

uを記述しないと(U+30C0) とマッチしないことがあるのでご注意下さい。

半角

PCRE 関数 の preg_match を利用して正規表現のマッチングによるバリデーションを実装します。

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

マッチする範囲は下記になります。

  1. (U+FF61) –(U+FF9F) : Halfwidth and Fullwidth Forms > Half-width kana

全角 + 半角

簡易的には、PCRE 関数 の preg_match を利用して正規表現のマッチングによるバリデーションを実装します。

第一引数の pattern には、PCRE 正規表現構文 の Unicode 文字プロパティ である\p{Katakana}を指定します。

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

マッチする範囲は下記になります。

  1. (U+30A0) – (U+30FF) : Katakana
  2. (U+31F0) –(U+31FF) : Katakana Phonetic Extensions
  3. (U+32D0) –(U+32FE) : Enclosed CJK Letters and Months > Circled Katakana
  4. (U+3300) –(U+3357) : CJK Compatibility > Squared Katakana Words
  5. (U+FF61) –(U+FF9F) : Halfwidth and Fullwidth Forms > Half-width kana
  6. U+1AFF0 – U+1AFFE : Kana Extended-B
  7. U+1B000 : Kana Supplement
  8. U+1B120 – U+1B122 : Kana Extended-A
  9. U+1B164 – U+1B167 : Small Kana Extension

Katakana と Half-width kana に絞り込む場合は下記のようになります。

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

マッチする範囲は下記になります。

  1. (U+30A0) – (U+30FF) : Katakana
  2. (U+FF61) –(U+FF9F) : Halfwidth and Fullwidth Forms > Half-width kana

pattern は要件に合わせて、柔軟に書き換えて対応すれば良いでしょう。

環境

  1. MAMP 6.8
  2. Apache 2.4.54
  3. PHP 8.2.0

解説

初めに、Unicode Block を理解しましょう。

Unicode とは、簡単に言うと Unicode Consortium という非営利団体によって維持されている世界中の文字や記号を 1 つの文字コード体系で扱える様に作られた符号化文字集合のことです。

Unicode Block とは、Code point の連続する範囲のことです。

Code point とは、特定の文字にマップされる数値のことです。

例えば、Unicode は 0 hex – 10FFFF hex の数値です。

全角

仕様

全角片仮名の Unicode Block は、下表の通り U+30A0 〜 U+30FF の 96 個になります。

0123456789ABCDEF
U+30Ax
U+30Bx
U+30Cx
U+30Dx
U+30Ex
U+30Fx
Katakana(Unicode 15.1)

実装

PCRE 関数 の preg_match を利用して正規表現のマッチングによるバリデーションを実装します。

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

記述している PCRE 正規表現構文 の説明になります。

  1. /デリミタ
  2. \Aエスケープシーケンス 検索対象文字列の始端
  3. []文字クラス
  4. ゠-ヿ: Katakana
  5. +量指定子 {1,} と同じ 直前の表現を 1 回以上繰り返す
  6. \zエスケープシーケンス 検索対象文字列の終端
  7. u修飾子 UTF-8 として処理する

マッチさせる範囲は、要件に合わせて pattern を書き換えると良いでしょう。

因みに、^[...]$という書き方は 修飾子 の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)

半角

仕様

半角片仮名の Unicode Block は、下表の通り U+FF61 〜 U+FF9F の 63 個になります。

0123456789ABCDEF
U+FF6x
U+FF7xソ
U+FF8x
U+FF9x
Half-width kana(Unicode 15.1)

(U+FF60) は、半角片仮名の範囲を分かりやすくする為に空白セルとしています。

実装

PCRE 関数 の preg_match を利用して正規表現のマッチングによるバリデーションを実装します。

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

記述している PCRE 正規表現構文 の説明になります。

  1. /デリミタ
  2. \Aエスケープシーケンス 検索対象文字列の始端
  3. []文字クラス
  4. 。-゚: Halfwidth and Fullwidth Forms > Half-width kana
  5. +量指定子 {1,} と同じ 直前の表現を 1 回以上繰り返す
  6. \zエスケープシーケンス 検索対象文字列の終端
  7. u修飾子 UTF-8 として処理する

マッチさせる範囲は、要件に合わせて pattern を書き換えると良いでしょう。

全角 + 半角

実装

簡易的には、PCRE 関数 の preg_match を利用して正規表現のマッチングによるバリデーションを実装します。

第一引数の pattern には、PCRE 正規表現構文 の Unicode 文字プロパティ である\p{Katakana}を指定します。

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

記述している PCRE 正規表現構文 の説明になります。

  1. /デリミタ
  2. \Aエスケープシーケンス 検索対象文字列の始端
  3. \p{Katakana}: マッチする範囲は下記になります。
    1. (U+30A0) – (U+30FF) : Katakana
    2. (U+31F0) –(U+31FF) : Katakana Phonetic Extensions
    3. (U+32D0) –(U+32FE) : Enclosed CJK Letters and Months > Circled Katakana
    4. (U+3300) –(U+3357) : CJK Compatibility > Squared Katakana Words
    5. (U+FF61) –(U+FF9F) : Halfwidth and Fullwidth Forms > Half-width kana
    6. U+1AFF0 – U+1AFFE : Kana Extended-B
    7. U+1B000 : Kana Supplement
    8. U+1B120 – U+1B122 : Kana Extended-A
    9. U+1B164 – U+1B167 : Small Kana Extension
  4. +量指定子 {1,} と同じ 直前の表現を 1 回以上繰り返す
  5. \zエスケープシーケンス 検索対象文字列の終端
  6. u修飾子 UTF-8 として処理する

下記 Unicode Block に関しても片仮名文字が含まれています。

  1. Katakana Phonetic Extensions(片仮名拡張)
  2. Enclosed CJK Letters and Months(囲み CJK 文字・月)
  3. CJK Compatibility(CJK 互換用文字)
  4. Kana Extended-B(仮名拡張B)
  5. Kana Supplement(仮名補助)
  6. Kana Extended-A(仮名拡張A)
  7. Small Kana Extension(小書き仮名拡張)

絞り込む場合、例えば、Katakana + Half-width kana は下記のようになります。

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

記述している PCRE 正規表現構文 の説明になります。

  1. /デリミタ
  2. \Aエスケープシーケンス 検索対象文字列の始端
  3. []文字クラス
  4. ゠-ヿ: Katakana
  5. 。-゚: Halfwidth and Fullwidth Forms > Half-width kana
  6. +量指定子 {1,} と同じ 直前の表現を 1 回以上繰り返す
  7. \zエスケープシーケンス 検索対象文字列の終端
  8. u修飾子 UTF-8 として処理する

マッチさせる範囲は、要件に合わせて pattern を書き換えると良いでしょう。

検証

検証用に簡単なプログラムを書きました。

<?php
$fullwidth_katakana = $_POST['fullwidthKatakana'] ?? '';
$halfwidth_katakana = $_POST['halfwidthKatakana'] ?? '';
$katakana = $_POST['katakana'] ?? '';
$katakana_2 = $_POST['katakana2'] ?? '';

if ($fullwidth_katakana) {

  if (checkFullwidthKatakana($fullwidth_katakana)) echo '<p>全角の入力チェック結果 : OK</p>';
  else echo '<p>全角の入力チェック結果 : NG</p>';
}

if ($halfwidth_katakana) {

  if (checkHalfwidthKatakana($halfwidth_katakana)) echo '<p>半角の入力チェック結果 : OK</p>';
  else echo '<p>半角の入力チェック結果 : NG</p>';
}

if ($katakana) {

  if (checkKatakana($katakana)) echo '<p>片仮名(Unicode 文字プロパティ)の入力チェック結果 : OK</p>';
  else echo '<p>片仮名(Unicode 文字プロパティ)の入力チェック結果 : NG</p>';
}

if ($katakana_2) {

  if (checkKatakana2($katakana_2)) echo '<p>片仮名(正規表現)の入力チェック結果 : OK</p>';
  else echo '<p>片仮名(正規表現)の入力チェック結果 : NG</p>';
}

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

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

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

function checkKatakana2(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>
    全角:<input type="text" name="fullwidthKatakana">
  </p>
  <p>
    半角:<input type="text" name="halfwidthKatakana">
  </p>
  <p>
    片仮名(Unicode 文字プロパティ):<input type="text" name="katakana">
  </p>
  <p>
    片仮名(正規表現):<input type="text" name="katakana2">
  </p>
  <input type="submit" value="送信する">
</form>

</body>
</html>

全角

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

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

半角

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

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

片仮名(Unicode 文字プロパティ)

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

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

片仮名(正規表現)

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

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

参考

  1. PHP マニュアル
  2. Unicode block
目次