参考
この記事を作るにあたり、以下のサイトを大いに参考にしました。
なるべく短い正規表現で住所を「都道府県/市区町村/それ以降」に分けるエクストリームスポーツ
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"
}