どもども、indieees の山口です。
昨日、必要に迫られまして、住所から市区町村を取得しようということをやりました。僕のファイナルアンサーは最後に書いてあります(笑)
いくつか方法はありますが、今回は、すでに住所が入力されている前提でしたので、正規表現を使って、市区町村に該当する部分を抜き出そうということに。
とりあえずググりまして……、以下の記事を参考にしました。その節はお世話になりました。
さて、最初にご紹介した記事に正規表現のパターンが記載してあったので、いきなり完了♪と思ったのですが、以下にもあるパターンが、今回重要だったのです。
なるべく短い正規表現で住所を「都道府県/市区町村/それ以降」に分けるエクストリームスポーツ - Qiita
どういうことかというと、今回は「市と区が含まれる場合、区を優先する」というルールがあったため、@zakuroishikuro(zakuro) さんのパターンでは「○○市□□区」というように取得され、僕のほしい結果とは微妙に異なりました。
取得したものを分割すればいいじゃん……そんなことは百も承知ですが、それなら最初から、住所を逆転して市区町村で分割する方法を取ります。
せっかく正規表現で取得してやろうとしているのですから、パターンの工夫でなんとかしたい。そういう質なのです。
極力、パターンに市名などは追加したくなかったので、このあたりも何とかしたい。ただ、めじろ (id:boonv4m312s) さんの記事を読むと、都道府県については記述する方がスマートのように思えました。
また、今回は住所が省略されているケースも考慮する必要がありました。例えば、都道府県や市が省略されている(いきなり区から始まるケース)とかですね。
諸々を考えまして、最終的には以下のパターンに落ち着きました。
/(北海道|東京都|(?:京都|大阪)府|.+県)?(.+市|.+区|.+郡)?(.+区)?(.+[町村])?(.*)?/u
あぁ、文字サイズでかい……。
※訂正※
投稿後に対応できていない部分を再検討しました。
/(北海道|東京都|(?:京都|大阪)府|.+県)?(.{1,2}市|.{1,3}市|.{1,4}市|.{1,5}市|.{1,6}市|.+区|.+郡)?(.+区)?(.{1,3}[町村]|.{1,4}[町村]|.{1,5}[町村])?(.*)?/u
長くなってしまった……。
最初に「都道府県」、次に「市区郡」、そして「区」(○○市□□区の場合、□□区だけがほしい)、「町村」、「その他」と、住所がこの順になっている前提のパターンとなります。各々に「?」をつけることで、省略されたケースにも対応します。
PHP で preg_match() に使用した場合、省略または未入力の箇所が空っぽの要素となりますが、後続の処理で無視してください。
Qiita みたいな記事となってしまいましたが、いかがだったでしょうか。参考にさせてもらいました記事のお二人には感謝しかありません。ありがとうございます。
背中がフローリングの硬さに負けそう。寝具を見直さないと。このままでは、イキるのしんどい。