こんばんは、ウチイダです。

住所のテキストしかない状況で、都道府県を抜き出す処理を作ったとき、意外にもちょっとてこずったのでメモしておきます。

    /**
     * 住所から都道府県を切り出す
     * 要素0に都道府県、要素1に市区町村以下の住所を格納した配列を返す
     * @param string $address
     */
    function separateAddressPref(string $address)
    {
        $array = [];
        preg_match('/^(京都府|.*?[都道府県])(.*$)/u', $address, $array);
        $ret = [];
        if (count($array) > 0) {
            $ret[] = $array[1];
            $ret[] = $array[2];
        } else {
            $ret[] = '';
            $ret[] = $address;
        }
        return $ret;
    }

住所がある場合、たいてい郵便番号などもあるので、その場合は郵便番号から都道府県を取ってくる方が楽だと思います。

今回は郵便番号がない状況だったので、住所の文字列から取り出す仕様になりました。

てこずりポイントは、コード見ても明らかなように「京都府」という特殊パターンの存在です。

「都」と「府」が両方含まれているので、京都府だけ一塊の文字列として扱うようにしています。

以上です。

あなたのお役に立てれば幸いです。