Vimとボクと、ときどき、PHP

Vim好きなエンジニア(主にPHP開発)が不定期に技術情報やネタを書いていくブログです

Home » 仮名 かな カナ/MIX

仮名 かな カナ/MIX

Webシステムを作っていますと、入力値のバリデーションは必須です。メールフォームなんかそうですよね。「住所は必須入力」とか、「電話番号はハイフンを入力しない」とか。

そんな中で、例えば氏名の「フリガナ」を入力させる部分では「全角カタカナのみ」というチェックを行うことがあります。PHPでそれを実現する方法と、様々なパターンを考えてみました。

どうやってチェックするか

「与えられた文字列が全角カタカナのみで構成されている」を判定することになります。そういう便利関数を集めたライブラリもあるかもしれませんが、それだけのためにわざわざライブラリを1つ追加するのも大袈裟ですので、自分で判定を作ることにしましょう。
なお、文字コードはUTF-8であることを前提とします。

メジャーで簡単な方法は正規表現ですよね。というか、私はこの方法以外に思い付きません。
文字列を1文字ずつに分割してループする方法もあるかもしれませんが、マルチバイト文字列を1文字ずつに分割する方法がPHPには用意されていないようですし、正規表現が一番シンプルだと思います。

注意点は下記の3点。

  • UTF-8では、全角カタカナは「ァ、ア、ィ、イ、…、カ、ガ、キ、ギ、…ヲ、ン、ヴ、ヵ、ヶ」と並んでいます。なので正規表現で「全角カタカナ」を表現しようとすると、上記のようになります。(参考:UTF-8ひらがなカタカナ表
  • デリミタの後に「u」が付いています。パターン修飾子と呼ばれるもので、これを付けないとpreg_matchでUTF-8文字列を扱う際にうまくいかないようです。詳しいことは私は理解できておりませんが。(参考:パターン修飾子
  • これはpreg_matchを使うときの注意ですが、戻り値は「==」(!=)ではなく「===」(!==)で判定するようにしましょう。preg_matchはパターンにマッチする場合は1を、マッチしない場合は0を、エラーが発生した場合はfalseを返す仕様なので、==や!=で判定すると0とfalseが同一視されてしまい、場合によっては意図した処理になりません。

いろんなパターン

フリガナを入力してもらう時は、カタカナのみとは限りません。「平仮名のみ」の場合もあるでしょうし、「平仮名でもカタカナでも可」ということもあるでしょう。いろんなパターンをどう判定するか、考えてみました。

1. ひらがなのみ

これはカタカナをひらがなにするだけなので、簡単です。

ひらがなには、小さい「か」と小さい「け」と「うに濁点」(カタカナの「ヵ」、「ヶ」、「ヴ」に対応する文字)が無いので、文字の範囲は「ん」までとなります。

2. ひらがなでもカタカナでもいい

ひらがなとカタカナを組み合わせます。

この場合、「すずきたろう」も「スズキタロウ」もOKになります。ただし「すずきタロウ」のように、ひらがなとカタカナが混ざったものはNGとします。

3. 姓と名の間にスペースを入れてもいい。ついでに「のばし棒(ー)」を許可する。

「すずき たろう」のように、姓と名の間にスペースを入れてもいいものとします。(個人的な意見を言わせてもらえば、その後の顧客管理のしやすさを考えると、姓と名は別のフィールドに入力させるのが好みですが)
また、日本語が堪能な George さんが「ジョージ」と入力できるように、「のばし棒(ー)」の入力も許可することにしましょう。

見た目で分かりづらいですが、パターンの空白部分は全角スペースと半角スペースが並んでいます。この方法では、「 すずきたろう」や「スズキタロウ 」のように先頭や末尾にスペースが入ってもOKになってしまいますので、「姓と名の間だけスペースを許可する」と厳密にやりたい場合は工夫が必要です。

4. 半角カナも許可する

Webで半角カナを使うことはタブーとされておりますが、入力できてしまう以上、ユーザが入力しないとも限りません。NGにしてしまうのが一般的ですが、せっかくなので半角カナも許可する方針にしてみましょう。UTF-8であれば半角カナは特に問題にはなりません。

半角カナの並び順はひらがなやカタカナと違い、半角の「ヲ」から始まります。終わりは半角の「゜」です。半角の「のばし棒」はこの範囲内に入っているため、スペースを追加してやるだけで完成です。半角カナの場合は半角スペースのみを許可するように書いています。
ただし、「ウ゜」(半角カナと思ってください)のような読めない入力も許可してしまいます。

5. 何でもいいから仮名であれば許可

4までで全ての「仮名」を網羅しましたので、最後に「とにかく仮名であればいい」というパターンを紹介しましょう。
「すずきタロウ」のように、ひらがなとカタカナが混ざった入力すらも許可することにします。「データベースに登録するときに全角カナに統一する処理をやるから、入力の段階ではとにかく仮名であれば何でもいい」というケースで使えます。ここまでくると適当すぎな気もしますが。

最後のわりに単純ですね。
まずmb_convert_kanaで、入力された文字列を全角カタカナに統一しています。第1引数は入力された文字列です。第2引数の’CKV’は、Cが「ひらがなをカタカナに変換」、Kが「半角カナを全角カタカナに変換」、Vが「濁点つきの文字を1文字に変換(半角のバはハと濁点の2文字ですが、それを1文字のバにする)」という意味になります。
全角カタカナに変換したら、あとは「全ての文字が全角カタカナか?」をチェックするだけ。いったんmb_convert_kanaを通してやることで、半角カナの「ウ゜」は「全角ウと全角半濁点」に変換され、「全角半濁点」は正規表現のパターンにマッチしないのでNGとすることができます。

なぜ全角ひらがなではなく全角カタカナに変換するかというと、全角カタカナにのみ「ヵ」「ヶ」「ヴ」が存在するからです。

最後に

どうでもいい話なので最後にもってきました。
この記事のタイトル「仮名 かな カナ/MIX」の元ネタが「TORA TORA TORA/MAX」と分かった人は私と同年代かつ同じ思考回路の持ち主と認定します。特典は特にないです。

Name of author

Name: よーすけ

Short Bio: 主にPHP開発をやってる社内PGです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です