自由記述で書かれた都道府県市区町村をPHPで分ける方法

単純に以下のようにしたらアウトーです

$rcd = preg_match('/^(.*?)(?:都|道|府|県)(.*?)(?:市|区|町|村)(.*?)$/', $str, $result);

なぜなら、名前に市や区が使われている市区町村があるからです。
例えば、市川市四日市市など



私的雑録さんで公開されているものを使わしてもらいましょう!
http://php.o0o0.jp/article/php-split_address

$rcd = preg_match('/(東京都|北海道|(?:京都|大阪)府|.{6,9}県)((?:四日市|廿日市|野々市|かすみがうら|つくばみらい|いちき串木野)市|(?:杵島郡大町|余市郡余市|高市郡高取)町|.{3,12}市.{3,12}区|.{3,9}区|.{3,15}市(?=.*市)|.{3,15}市|.{6,27}町(?=.*町)|.{6,27}町|.{9,24}村(?=.*村)|.{9,24}村)(.*)/', $str, $result);