QA@IT

php で住所に(半角|全角)数字が含まれているかチェックする正規表現について

5921 PV

住所の登録で番地を記入しない人が非常に多くて困ってます。(3~5%ぐらい?)
そこでフォームの時点でチェックをしたいのですがうまくできません。

使っている条件は下記のとおりです。
半角のみの条件[0-9]の場合ならうまくいくのですが、全角数字[0-90-9]が入るとうまく動作しません。

mb_ereg_match ("^.+[0-90-9]",$address)

条件
・行頭に何文字か地名が入り、その後、全角または半角の数字が入る
・文字コード UTF-8

本来なら漢数字も含めるべきですが、
1.地名に漢数字が入ることがある
2.WEBフォームで漢数字で地番を書く人がほとんどいない
ということで今回は考慮していません。

よろしくお願いします。

回答

1.番地だけの入力フィールドを作る。以下のように入力フィールドを分割する。
・都道府県
・地区町村
・番地
・ビル/アパート

2.全て漢字ならエラーにする。
http://pentan.info/php/reg/is_kanji.html
以下のURLの中の「UTF-8 コード表記」が良さそうです。
全角の「0」から「9」は漢字ではないと判断されます。

編集 履歴 (0)

PHP 5.4.4、「mbstring.internal_encoding => UTF-8」の環境で下記のコードを使ってテストしてみました。(ファイルの文字コードはUTF-8、改行コードはLFです)

<?php
// 正規表現パターン
$pattern = '/^.*[0-90-9]/';

$tmp[1]="テスト";   // 末尾数字無し
$tmp[2]="テスト1";  // 末尾半角数字
$tmp[3]="テスト1"; // 末尾全角数字

foreach( $tmp as $dat )
{
    echo $dat . '=>' . preg_match($pattern, $dat) . "\n";
}

手元の環境で実行すると、下記のようになるので要件は満たしているかと思います。

$ php ./test.php
テスト=>0
テスト1=>1
テスト1=>1

半角数字と全角数字の区別を無視して良いなら、$tmp = mb_convert_kana( $target, 'as', 'UTF-8');のようにして、半角に統一してからチェックするというのも悪くないかもしれません。

ウォッチ

この質問への回答やコメントをメールでお知らせします。