« 光プレミアム申込完了!FOMAハイスピードエリア拡大 »

正規表現で住所分割

正規表現で住所分割

パーマリンク 2008/12/19 15:33:39 著者: kumaold メール
カテゴリ: プログラミング, PHP

美容室案内ネット一六社が正式オープンしたようなので、次なる目標としてデータ拡充の一環でホットペッパーBeautyのデータ取り込みをしている最中です。


ところがこのAPI、住所データが郵便番号すらない上、建物名も全て1つのフィールドに入っているため開発者には優しい仕様ではありません。

かといって、全4,000件のデータに手動で手を加えるのも気の遠くなる作業・・・


ということで正規表現で分割できないか挑戦してみました。

例外やら何やら全部は書ききれないので要約すると、これで大まかに「都道府県」「市区郡」「それ以下住所」「建物名」に分けます。

(東京都|北海道|[一-龠]+[府県]){1}([一-龠ぁ-ヶ]+[市区郡]){1}([一-龠ぁ-ヶー]+[0-9\-‐F番地号条線西東丁目の]+){1}\s*([\sa-zA-z0-9一-龠ぁ-ヶー、・\-\(\)\.\/\']*)

その後に郡以下の場合はこれで町村名を取り出します。

([一-龠ぁ-ヶー]+[町村]){1}

政令指定都市の市名も同様に分割できます。

しかし、平成の大合併のおかげで政令指定都市でもないのに市以下に区のつくところがいくつか誕生してしまいました。
(石狩市、伊達市、八戸市、盛岡市、奥州市、南相馬市、香取市、上越市、宇陀市、姫路市)

これらはうまいこと例外処理を施してあります。


1/15 以下、完全ソース公開

$addr = $_GET['addr'];
$addr_conv = mb_convert_kana($addr, 'a');
//正規表現で切り分け
mb_ereg("(東京都|[一-龠]+[府道県]){1}(石狩市|伊達市|八戸市|盛岡市|奥州市|南相馬市|香取市|上越市|宇陀市|姫路市|[一-龠ぁ-ヶ]+[市区郡]){1}([一-龠ぁ-ヶー]+[0-9\-‐F番地号条線西東丁目の]+){1}\s*([\sa-zA-z0-9一-龠ぁ-ヶー、・\-\(\)\.\/\']*)", $addr_conv, $match);
//郡の場合の町村分割
if (($_GET['town_split']) && mb_ereg("郡$", $match[2])) {
    mb_ereg("([一-龠ぁ-ヶー]+[町村]){1}([一-龠ぁ-ヶー]*[0-9\-‐F番地号条線西東丁目の]+)", $match[3], $town);
    $match[3] = $town[2];
}
//政令指定都市の区分割
if (($_GET['city_split']) && mb_ereg("区$", $match[2], $city) && $match[1] != "東京都") {
    mb_ereg("([一-龠ぁ-ヶ]+市){1}([一-龠ぁ-ヶ]+区){1}", $match[2], $city);
    $match[2] = $city[1];
}



Web用にそれなりのインターフェイスを作ったのがこちら。

住所分割ツール手抜き版

そのうちXML版(Webサービス)も作る予定。



住所と地名の大研究 (新潮選書)住所と地名の大研究 (新潮選書)
今尾 恵介

新潮社 2004-03-17
売り上げランキング : 188314
おすすめ平均

Amazonで詳しく見る
type="text/javascript" src="http://www.ad16.jp/socailmedia.php?a=CCBot%2F2.0+%28http%3A%2F%2Fcommoncrawl.org%2Ffaq%2F%29&u=http%3A%2F%2Fkuroutoshikou.blog16.jp%2Findex.php%2F2008%2F12%2F19%2Faspeb_eiuc_fa_saf_a_a_a_s" charset="EUC-JP">

一六社で働くITエンジニアのブログ。

普段はWeb系システム開発と地元のPCサポートをやってます。いつの間にやら会社に8年目。
技術ネタ中心に日々の仕事と生活と趣味やらを気が向いたら書いてます。

2017年3月
 << <   > >>
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  

検索

XMLフィード

16ブログ     free open source blog