住所文字列の分解

ブログ | 2010/8/6 01:27
区切りのない住所文字列から、
都道府県と市区町村とその他に分けます。

<?php

$str = '石川県石川郡野々市町住吉町';
//$str = '長崎県北松浦郡鹿町町鹿町免';
//$str = '三重県四日市市高砂町';
//$str = '広島県廿日市市須賀';
//$str = '岩手県花巻市東和町落合1区';
//$str = '新潟県上越市中郷区江口';
//$str = '北海道旭川市四区三条四丁目';

preg_match('/^(北海道|青森県|岩手県|秋田県|山形県|宮城県|福島県|新潟県|栃木県|群馬県|茨城県|埼玉県|千葉県|東京都|神奈川県|山梨県|静岡県|長野県|富山県|石川県|福井県|岐阜県|愛知県|三重県|奈良県|和歌山県|滋賀県|京都府|大阪府|兵庫県|岡山県|広島県|鳥取県|島根県|山口県|香川県|徳島県|愛媛県|高知県|福岡県|佐賀県|長崎県|熊本県|大分県|宮崎県|鹿児島県|沖縄県)(北松浦郡鹿町町|.+?郡.+?町|.+?郡.+?村|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.+?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);

$pref = !empty($match[1]) ? $match[1] : '';
$city = !empty($match[2]) ? $match[2] : '';
$town = !empty($match[3]) ? $match[3] : '';

?>

Yahoo!のAPIが区切りを入れてくれると嬉しいのだけれど...
▼追記 2010/8/28 05:47
townに区が入ると切れなかったので、少し修正。
まだ網羅はできてない気はします。
▼追記 2010/8/28 16:15
都道府県も省略して、これでいけるかな。
preg_match('/^(.+?[都道府県])(北松浦郡鹿町町|.+?郡.+?町|.+?郡.+?村|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.+?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);

都・道・府・県の文字列の入る都道府県はないですよね?
▼追記 2010/8/28 16:23
もう少し短くできるか
preg_match('/^(.+?[都道府県])(北松浦郡鹿町町|.+?郡.+?[町村]|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.+?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?[市町村])(.*)$/u',$str,$match);
▼追記 2010/8/29 18:23
京都府が失敗してたので追加。
preg_match('/^(京都府|.+?[都道府県])(北松浦郡鹿町町|.+?郡.+?[町村]|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.+?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?[市町村])(.*)$/u',$str,$match);
▼追記 2010/8/31 12:21
一文字区がまずかったので、更に修正。
preg_match('/^(京都府|.+?[都道府県])(北松浦郡鹿町町|.+?郡.+?[町村]|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.*?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?[市町村])(.*)$/u',$str,$match);
▼追記 2010/8/31 21:19
省略で失敗(「羽村市」にて)したので、少し長く戻しました。
preg_match('/^(京都府|.+?[都道府県])(北松浦郡鹿町町|.+?郡.+?町|.+?郡.+?村|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|.*?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);
▼追記 2010/9/1 00:42
フィードバックから、大和郡山市,杵島郡大町町,周南市 を追加。
preg_match('/^(京都府|.+?[都道府県])(大和郡山市|北松浦郡鹿町町|杵島郡大町町|.+?郡.+?町|.+?郡.+?村|宇陀市|奥州市|上越市|黒部市|豊川市|姫路市|周南市|.*?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);
▼追記 2010/9/1 01:28
フィードバックから、「区」コレクション
http://uub.jp/nam/ku.html

これで、イイ線いったんじゃなかろうか。
preg_match('/^(京都府|.+?[都道府県])(大和郡山市|北松浦郡鹿町町|杵島郡大町町|.+?郡.+?町|.+?郡.+?村|石狩市|伊達市|八戸市|盛岡市|奥州市|南相馬市|上越市|姫路市|宇陀市|黒部市|小諸市|富山市|岩国市|周南市|佐伯市|.*?[^0-9一二三四五六七八九十]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);
▼追記 2010/9/1 11:44
masaさん情報から、西海市を追加かな。
北松浦郡鹿町町は、佐世保市に合併とのことなので、いずれ消去。
▼追記 2010/9/1 22:54
これでどうじゃ!
preg_match('/^(京都府|.+?[都道府県])(大和郡山市|蒲郡市|小郡市|杵島郡大町町|.+?郡.+?町|.+?郡.+?村|石狩市|伊達市|八戸市|盛岡市|奥州市|南相馬市|上越市|姫路市|宇陀市|黒部市|小諸市|富山市|岩国市|周南市|佐伯市|西海市|.*?[^0-9一二三四五六七八九十上下]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);

穴を見つけた方には、2pt差し上げます。
▼追記 2010/9/1 23:11
こうしようかと思うのですが、ご意見募集中。
preg_match('/^(京都府|.+?[都道府県])(大和郡山市|蒲郡市|小郡市|杵島郡大町町|.+?郡.+?町|.+?郡.+?村|(大阪市|名古屋市|京都市|横浜市|神戸市|北九州市|札幌市|川崎市|福岡市|広島市|仙台市|千葉市|さいたま市).+?区|(千代田|中央|港|新宿|文京|台東|墨田|江東|品川|目黒|大田|世田谷|渋谷|中野|杉並|豊島|北|荒川|板橋|練馬|足立|葛飾|江戸川)区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*)$/u',$str,$match);

$pref = !empty($match[1]) ? $match[1] : '';
$city = !empty($match[2]) ? $match[2] : '';
$town = !empty($match[5]) ? $match[5] : '';
▼追記 2011/1/21 15:38
これのフィードバックやらねばだな。
今夜やろう。
▼追記 2011/2/8 23:24
現在のかたち(なぜか、ここからはjavascriptで)
var m = addr.match(/^(京都府|.+?[都道府県])(大和郡山市|蒲郡市|小郡市|杵島郡大町町|山口市|鹿児島市|鈴鹿市|.+?郡.+?町|.+?郡.+?村|石狩市|伊達市|八戸市|盛岡市|奥州市|南相馬市|上越市|姫路市|宇陀市|黒部市|小諸市|富山市|岩国市|周南市|佐伯市|西海市|.*?[^0-9一二三四五六七八九十上下]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*?)([0-9-]*?)$/);
var a = {};
a.pref = m[1] || '';
a.city = m[2] || '';
a.town = m[3] || '';
a.numb = m[4] || '';
▼追記 2011/2/9 00:11
懲りずに。
var m = addr.match(/^(京都府|.+?[都道府県])(大和郡山市|蒲郡市|小郡市|杵島郡大町町|(?:[^市]*?|余市|高市)郡.+?[町村]|(?:石狩|伊達|八戸|盛岡|奥州|南相馬|上越|姫路|宇陀|黒部|小諸|富山|岩国|周南|佐伯|西海)市|.*?[^0-9一二三四五六七八九十上下]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*?)([0-9-]*?)$/);
▼追記 2012/5/8 00:48
フィードバックいただいたので、追加。
var m = addr.match(/^(京都府|.+?[都道府県])(大和郡山市|蒲郡市|小郡市|郡上市|杵島郡大町町|佐波郡玉村町|(?:[^市]*?|余市|高市)郡.+?[町村]|(?:石狩|伊達|八戸|盛岡|奥州|南相馬|上越|姫路|宇陀|黒部|小諸|富山|岩国|周南|佐伯|西海)市|.*?[^0-9一二三四五六七八九十上下]区|四日市市|廿日市市|.+?市|.+?町|.+?村)(.*?)([0-9-]*?)$/);
郵便番号簿をパラパラと眺めていたところ、townに区が入る例って結構あるようです。
masa_h | 2010/08/31 23:00
と書いてから気づいたけど[^0-9一二三四五六七八九十]でほとんど排除できてるのか。
masa_h | 2010/08/31 23:04
ポストマップからお邪魔します。
kuwaさん、もうひとつ追加してください。
佐賀県杵島郡大町町というのがあります。
871xxxx | 2010/08/31 23:09
追加です。
大和郡山市で、それに続く住所が○○町の場合。
871xxxx | 2010/08/31 23:41
特殊な市町村名は、それ以外発見できませんでした。

あとは、「~市~区」で、区の直前が数ではない場合が排除できないわけですよね。
「周南市公園区」でマップを検索し、その地点でマッピングすると・・・うむむ。
871xxxx | 2010/09/01 00:26
kuwa
いくつもありがとうございます。すごく助かります。

townに「区」関係は、数字と僕が調べた限りでは、下記の市であったので、そこを排除しています。ここに抜けは結構ありそうですけれど。
宇陀市|奥州市|上越市|黒部市|豊川市|姫路市

で、周南市は追加します。
kuwa | 2010/09/01 00:40
「区」、結構ありますよ~。
http://uub.jp/nam/ku.html
たもっち | 2010/09/01 00:45
政令指定都市以外で「区」を使ってる所、思った以上に多いですね。
ちょっと気になったので「下区」でマップ検索してみたところ、佐賀県唐津市相知町伊岐佐の「下区」に飛びました。
ここでマッピングすると、やはり同様になりますよね。

小字レベルで「~(上・中・下・東・西・南・北)区」というような地名は全国的に相当隠れているような気がします。
全てを網羅するのは困難に思えます。
逆に政令指定都市(&東京都)をリストアップして、そこだけ区で区切るというのはどうでしょうか。

あと「小郡市」も大和郡山パターンですね。たまたま「町」がつく地名がないのでセーフですが。
871xxxx | 2010/09/01 13:21
kuwa
上・下は、政令指定都市にはなさそうなので排除してみます。
http://www1.odn.ne.jp/haru/data-list/toshi_ku.ht...
kuwa | 編集回数: 1 | 2010/09/01 22:51
kuwa
政令指定都市を書き出した方が精度が高い気がしてきました。
kuwa | 2010/09/01 23:00
kuwa
久しぶりにGoogleの逆ジオコーディングAPIを調べてみようかな。
Googleは、幹線道路の上だと都道府県とかなしの「青山通り」とかだけ返ってくるから困ってyahooなのだけれど、文字列はたしか区切れた。
kuwa | 2010/09/01 23:18
相模原市・静岡市・浜松市・岡山市 が抜けているようです。
masa_h | 2010/09/02 10:05
kuwa
ガガガ、そのページ古いのか...
kuwa | 2010/09/02 15:29
non_da_kure
こちらもいかがでしょうか
http://www.e-stat.go.jp/SG1/estat/redirect.do?ur...
non_da_kure | 2010/09/02 15:53
政令指定都市、あと新潟市・堺市も入れて現在19市です。
871xxxx | 2010/09/02 17:53
あ。2つ抜けてましたか。記憶だけに頼ってはダメですね^^;
masa_h | 2010/09/02 20:30
正規表現の最後の部分「(.*?)([0-9-]*?)$」ですが、「1-1-1-3F」などアルファベットが入るとtownに入ってしまうようなので、「(.*?)([0-9-A-Za-z]+.*?)$」としてみたらそれなりになりました。
ken | 2011/04/18 15:12
kuwa
それなりにそれなりですかー。v3化に併せてやってみます。
中途半端に進めてしまって(かつ止まってる)、アップするまで他に手をつけられないというのが現状。
kuwa | 2011/04/18 23:22
ありがとうございます。最後の正規表現を使わせていただきました。
全国の、まあわずか462の顧客名簿なのですが、
$pref, $city のみの切り出しをしましたが、完璧でした!
助かりました〜。
kkb | 2011/04/29 14:23
私も同じ事にチャレンジしていて、たまたまここをみつけました。
下記はperlのコードで市区町村までの分割です。

my $regt = '(?:鹿児島郡|三島郡|大島郡|杵島郡|猿島郡|羽島郡|鹿島郡)';
my $reskcs = '(?:武蔵村山市|十日町市|四日市市|廿日市市|東村山市|野々市市|上市町|下市町|余市町|大村市|大町市|大町町|玉村町|田村市|羽村市)';
$str =~ /^(.+?[都道府県])($regt|.+?[郡島])?($reskcs|.+?[市区町村])(.*?)$/o;
匿名 | 2013/05/17 15:31
Darlene Goodwin | 2017/08/01 01:27
http://www.yeezyboost750shoes950.com/ Adidas Yeezy 750 Boost
http://www.yeezyboost350v2zebras.com/ Adidas Yeezy Boost 350 v2 zebra
James Kessler | 2017/08/08 20:36
Roxie Macchi | 2017/12/02 15:24
縮小 拡大

ログインしておくと、後で編集が可能です。

Rottel内コンテンツ

ユーザー一覧

Rottelとは?
利用規約
開発飲料
利用者の声
ヘルプ
close