PHP で住所から都道府県を取り除く


住所から都道府県を取り除くサンプルは検索するとたくさんヒットしますが、次の条件でのご依頼があり、悩みましたのでここに記載しておきます。

  • (都道府県)+(市区町村から番地)+(建物名から部屋番号)が1つの文字列である。
  • (都道府県)が記載されている場合とない場合がある。
  • (建物名)に都道府県の名称が含まれている場合がある。

上の条件の住所を「(市区町村から番地)+(建物名から部屋番号)」で統一したい」がご依頼内容です。
「鹿児島県鹿児島市~」もあれば「鹿児島市~」もあり、さらに建物名に「鹿児島県」があったり・・・。
検索すると正規表現を利用しての例などいろいろありましたが、結果的に以下のコードに落ち着きました。
要は住所の頭3文字を抽出し、該当する都道府県名を選出。選出した都道府県名の文字列を取得して、住所の先頭からその文字列分を抽出し選出した文字列と比較し処理する方法です。文章で説明するよりコードをみた方がわかると思います。

<?php
define( '_CHARSET', 'UTF-8' );

function setPref( $mode ){
	$pref = array(
				1 => '北海道',
				2 => '青森県',
				3 => '岩手県',
				4 => '宮城県',
				5 => '秋田県',
				6 => '山形県',
				7 => '福島県',
				8 => '茨城県',
				9 => '栃木県',
				10 => '群馬県',
				11 => '埼玉県',
				12 => '千葉県',
				13 => '東京都',
				14 => '神奈川県',
				15 => '新潟県',
				16 => '富山県',
				17 => '石川県',
				18 => '福井県',
				19 => '山梨県',
				20 => '長野県',
				21 => '岐阜県',
				22 => '静岡県',
				23 => '愛知県',
				24 => '三重県',
				25 => '滋賀県',
				26 => '京都府',
				27 => '大阪府',
				28 => '兵庫県',
				29 => '奈良県',
				30 => '和歌山県',
				31 => '鳥取県',
				32 => '島根県',
				33 => '岡山県',
				34 => '広島県',
				35 => '山口県',
				36 => '徳島県',
				37 => '香川県',
				38 => '愛媛県',
				39 => '高知県',
				40 => '福岡県',
				41 => '佐賀県',
				42 => '長崎県',
				43 => '熊本県',
				44 => '大分県',
				45 => '宮崎県',
				46 => '鹿児島県',
				47 => '沖縄県'
			);
	if( $mode == 1 ){
		$pref[14] = '神奈川';
		$pref[30] = '和歌山';
		$pref[46] = '鹿児島';
	}
	return( $pref );
}

function prefFormat( $str = '' ){
	$address = '';
	if( strlen( $str ) > 0 ){
		$add         = $str;
		$prefListAll = setPref( 0 );
		$prefList3tx = setPref( 1 );
		$cutFirstAdd = mb_substr( $str, 0, 3, _CHARSET );
		$prefNo      = array_search( $cutFirstAdd, $prefList3tx );
		if( $prefNo > 0 && $prefNo <= count( $prefList3tx ) ){
			$prefLen = mb_strlen( $prefListAll[$prefNo], _CHARSET );
			$cutStr  = mb_substr( $str, 0, $prefLen, _CHARSET );
			if( $prefListAll[$prefNo] == $cutStr ){
				$add = mb_substr( $str, mb_strlen( $prefListAll[$prefNo], _CHARSET ), mb_strlen( $str, _CHARSET ), _CHARSET );
			}
		}
		$address = mb_convert_kana( $add, 'KVas', _CHARSET );
	}
	return( $address );
}

$str = '神奈川県相模原市中央区淵野辺1-19-25 神奈川県のある建物';
echo( prefFormat( $str ) );
?>