[PHP]自由入力された住所から市区町村を取り出す方法

  • 公開日:2018/1/5
この記事は最終更新日から6年以上が経過しています。

私は、上図のように住所入力欄を「都道府県」「住所1(市区町村〜番地)」「住所2(ビル名)」の3つに分けることが多いです。
都道府県はリストから選択で、住所1および住所2は自由入力です。

今回は、この自由入力にしている住所1のうち、市区町村までを取り出したいという要望がありました。preg_matchで正規表現を使って対応しようとしたのですが、「市川市」とか「四日市市」などに阻まれ、いろいろ試行錯誤しましたが上手くいかず困っていたところ、見事な正規表現を紹介されている記事を見つけたので参考にさせていただきました。

その正規表現がこれです。

((?:旭川|伊達|石狩|盛岡|奥州|田村|南相馬|那須塩原|東村山|武蔵村山|羽村|十日町|上越|富山|野々市|大町|蒲郡|四日市|姫路|大和郡山|廿日市|下松|岩国|田川|大村)市|.+?郡(?:玉村|大町|.+?)[町村]|.+?市.+?区|.+?[市区町村])(.+)

参考サイト
なるべく短い正規表現で住所を「都道府県/市区町村/それ以降」に分けるエクストリームスポーツ

これをPHPで表示するには以下のようにします。

<?php
$pref = '兵庫県';
$address = '神戸市中央区波止場町5-5';
$regex = '/((?:旭川|伊達|石狩|盛岡|奥州|田村|南相馬|那須塩原|東村山|武蔵村山|羽村|十日町|上越|富山|野々市|大町|蒲郡|四日市|姫路|大和郡山|廿日市|下松|岩国|田川|大村)市|.+?郡(?:玉村|大町|.+?)[町村]|.+?市.+?区|.+?[市区町村])(.+)/u';
preg_match_all($regex, $address1, $matches);

echo $pref. $matches[1][0];

私の場合は、都道府県を別入力(選択)にしているため、このようになりました。
都道府県も含めて自由入力にしている場合は、先ほどの参考サイトで紹介されている正規表現がそのまま使えます。

(…??[都道府県])((?:旭川|伊達|石狩|盛岡|奥州|田村|南相馬|那須塩原|東村山|武蔵村山|羽村|十日町|上越|富山|野々市|大町|蒲郡|四日市|姫路|大和郡山|廿日市|下松|岩国|田川|大村)市|.+?郡(?:玉村|大町|.+?)[町村]|.+?市.+?区|.+?[市区町村])(.+)

本当に助かりました!!!