[PHP]郵便番号を正規表現でチェックする


今回は下記のコードを使って見ていきます。

$zip = '123−4567';  //←全角

$zip = mb_convert_kana($zip, 'a', 'UTF-8');
if (preg_match("/\A\d{3}[-]\d{4}\z/", $zip)) {
  print('郵便番号:〒' . $zip);
} else {
  print('※郵便番号を 123-4567の形式でご記入ください');
}

↓のように表示されます。

郵便番号:〒123-4567  //←半角になっている

mb_convert_kanaについては → こちら

パラメーターで「'a'」を指定する理由

郵便番号は数字なので「'n'」では?と思うかもしれませんが、
-(ハイフン)が含まれているので英数字扱いとなります。
'a'」と指定することで、英数字を半角に直すことができます。

本題の正規表現ですが、まずpreg_matchというファンクションを使います。
続く/\A\d{3}[-]\d{4}\z/について見ていきます。


\d{3}

dというのは数字「DECIMAL(デシマル)」のこと
{3}は3つ
つまり、「数字を3つ並べること」という指定

[-]

前後を-(ハイフン)で結んでくださいという指定

\d{4}

「数字を4つ並べること」

ここまでで、\d{3}[-]\d{4}で郵便番号の書式をチェックしています。

それでは、前後の「\A」「\z」は何か?

\A

「文章の先頭であること」を指定

\z

「文章の最後であること」を指定

まとめると、/\A\d{3}[-]\d{4}\z/というのは
「数字3つ並んでいるのが先頭で、間に-(ハイフン)を挟んで、終わりは数字4つ並んでいます」
というルールの記述になります。

-(ハイフン)有無のチェックもされているので、
$zip = '1234567';だと

※郵便番号を 123-4567の形式でご記入ください

と返されます。


以上です。お疲れ様でした。