2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【PHP】住所を都道府県/市区町村/それ以降に分ける

Posted at

参考

この記事を作るにあたり、以下のサイトを大いに参考にしました。

なるべく短い正規表現で住所を「都道府県/市区町村/それ以降」に分けるエクストリームスポーツ
PHP: preg_match - Manual
[PHP] preg_match の正規表現の中で日本語(マルチバイト文字)を使う « Codaholic

コード

separate_address.php
<?php

/**
 * @param string $address
 * @return array
 */
function separate_address(string $address)
{
    if (preg_match('@^(.{2,3}?[都道府県])(.+?郡.+?[町村]|.+?市.+?区|.+?[市区町村])(.+)@u', $address, $matches) !== 1) {
        return [
            'state' => null,
            'city' => null,
            'other' => null
        ];
    }

    return [
        'state' => $matches[1],
        'city' => $matches[2],
        'other' => $matches[3],
    ];
}

var_dump(separate_address('京都府京都市東山区清水1丁目294'));
var_dump(separate_address('東京都府中市宮西町2丁目24番地'));

var_dump(separate_address('不正な住所'));

// 市より先がない
var_dump(separate_address('東京都府中市'));

// 市名に村が入ってるのでうまく分けられていない。今回は非対応
var_dump(separate_address('東京都東村山市本町1丁目2番地3'));

$ php separate_address.php
array(3) {
  ["state"]=>
  string(9) "京都府"
  ["city"]=>
  string(18) "京都市東山区"
  ["other"]=>
  string(16) "清水1丁目294"
}
array(3) {
  ["state"]=>
  string(9) "東京都"
  ["city"]=>
  string(9) "府中市"
  ["other"]=>
  string(24) "宮西町2丁目24番地"
}
array(3) {
  ["state"]=>
  NULL
  ["city"]=>
  NULL
  ["other"]=>
  NULL
}
array(3) {
  ["state"]=>
  NULL
  ["city"]=>
  NULL
  ["other"]=>
  NULL
}
array(3) {
  ["state"]=>
  string(9) "東京都"
  ["city"]=>
  string(6) "東村"
  ["other"]=>
  string(27) "山市本町1丁目2番地3"
}

2
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?