参考:
省级行政区:23个省、5个自治区、4个直辖市、2个特别行政区,合计34个省级行政区。
地级行政区:293个地级市、7个地区、30个自治州、3个盟,合计333个地级区划。
县级行政区:969个市辖区、386个县级市、1321个县、117个自治县、49个旗、3个自治旗、1个特区、1个林区,合计2847个县级区划。
核心思路:
只匹配两个或三个字,根据常用叫法[兼容:广西、广西自治区、广西壮族自治区]去掉一级,再进行下一级。
class addressFormat{
private $province = [
'北京' => '北京市',
'天津' => '天津市',
'重庆' => '重庆市',
'上海' => '上海市',
'河北' => '河北省',
'山西' => '山西省',
'辽宁' => '辽宁省',
'吉林' => '吉林省',
'江苏' => '江苏省',
'浙江' => '浙江省',
'安徽' => '安徽省',
'福建' => '福建省',
'江西' => '江西省',
'山东' => '山东省',
'河南' => '河南省',
'湖北' => '湖北省',
'湖南' => '湖南省',
'广东' => '广东省',
'海南' => '海南省',
'四川' => '四川省',
'贵州' => '贵州省',
'云南' => '云南省',
'陕西' => '陕西省',
'甘肃' => '甘肃省',
'青海' => '青海省',
'台湾' => '台湾省',
'黑龙江' => '黑龙江省',
'西藏' => '西藏自治区',
'广西' => '广西壮族自治区',
'宁夏' => '宁夏回族自治区',
'新疆' => '新疆维吾尔自治区',
'内蒙古' => '内蒙古自治区',
'香港' => '香港特别行政区',
'澳门' => '澳门特别行政区'
];
private $city = [
'忠县' => '忠县',
'东城' => '东城区',
'西城' => '西城区',
'丰台' => '丰台区',
'海淀' => '海淀区',
'房山' => '房山区',
'通州' => '通州区',
'顺义' => '顺义区',
'昌平' => '昌平区',
'大兴' => '大兴区',
'怀柔' => '怀柔区',
'平谷' => '平谷区',
'密云' => '密云区',
'延庆' => '延庆区',
'和平' => '和平区',
'河东' => '河东区',
'河西' => '河西区',
'南开' => '南开区',
'河北' => '河北区',
'红桥' => '红桥区',
'东丽' => '东丽区',
'西青' => '西青区',
'津南' => '津南区',
'北辰' => '北辰区',
'武清' => '武清区',
'宝坻' => '宝坻区',
'宁河' => '宁河区',
'静海' => '静海区',
'蓟州' => '蓟州区',
'唐山' => '唐山市',
'邯郸' => '邯郸市',
'邢台' => '邢台市',
'保定' => '保定市',
'承德' => '承德市',
'沧州' => '沧州市',
'廊坊' => '廊坊市',
'衡水' => '衡水市',
'太原' => '太原市',
'大同' => '大同市',
'阳泉' => '阳泉市',
'长治' => '长治市',
'晋城' => '晋城市',
'朔州' => '朔州市',
'晋中' => '晋中市',
'运城' => '运城市',
'忻州' => '忻州市',
'临汾' => '临汾市',
'吕梁' => '吕梁市',
'包头' => '包头市',
'乌海' => '乌海市',
'赤峰' => '赤峰市',
'通辽' => '通辽市',
'兴安' => '兴安盟',
'沈阳' => '沈阳市',
'大连' => '大连市',
'鞍山' => '鞍山市',
'抚顺' => '抚顺市',
'本溪' => '本溪市',
'丹东' => '丹东市',
'锦州' => '锦州市',
'营口' => '营口市',
'阜新' => '阜新市',
'辽阳' => '辽阳市',
'盘锦' => '盘锦市',
'铁岭' => '铁岭市',
'朝阳' => '朝阳', //'朝阳区',
'长春' => '长春市',
'吉林' => '吉林市',
'四平' => '四平市',
'辽源' => '辽源市',
'通化' => '通化市',
'白山' => '白山市',
'松原' => '松原市',
'白城' => '白城市',
'鸡西' => '鸡西市',
'鹤岗' => '鹤岗市',
'大庆' => '大庆市',
'伊春' => '伊春市',
'黑河' => '黑河市',
'绥化' => '绥化市',
'黄浦' => '黄浦区',
'徐汇' => '徐汇区',
'长宁' => '长宁区',
'静安' => '静安区',
'普陀' => '普陀区',
'虹口' => '虹口区',
'杨浦' => '杨浦区',
'闵行' => '闵行区',
'宝山' => '宝山区',
'嘉定' => '嘉定区',
'金山' => '金山区',
'松江' => '松江区',
'青浦' => '青浦区',
'奉贤' => '奉贤区',
'崇明' => '崇明区',
'南京' => '南京市',
'无锡' => '无锡市',
'徐州' => '徐州市',
'常州' => '常州市',
'苏州' => '苏州市',
'南通' => '南通市',
'淮安' => '淮安市',
'盐城' => '盐城市',
'扬州' => '扬州市',
'镇江' => '镇江市',
'泰州' => '泰州市',
'宿迁' => '宿迁市',
'杭州' => '杭州市',
'宁波' => '宁波市',
'温州' => '温州市',
'嘉兴' => '嘉兴市',
'湖州' => '湖州市',
'绍兴' => '绍兴市',
'金华' => '金华市',
'衢州' => '衢州市',
'舟山' => '舟山市',
'台州' => '台州市',
'丽水' => '丽水市',
'合肥' => '合肥市',
'芜湖' => '芜湖市',
'蚌埠' => '蚌埠市',
'淮南' => '淮南市',
'淮北' => '淮北市',
'铜陵' => '铜陵市',
'安庆' => '安庆市',
'黄山' => '黄山市',
'滁州' => '滁州市',
'阜阳' => '阜阳市',
'宿州' => '宿州市',
'六安' => '六安市',
'亳州' => '亳州市',
'池州' => '池州市',
'宣城' => '宣城市',
'福州' => '福州市',
'厦门' => '厦门市',
'莆田' => '莆田市',
'三明' => '三明市',
'泉州' => '泉州市',
'漳州' => '漳州市',
'南平' => '南平市',
'龙岩' => '龙岩市',
'宁德' => '宁德市',
'南昌' => '南昌市',
'萍乡' => '萍乡市',
'九江' => '九江市',
'新余' => '新余市',
'鹰潭' => '鹰潭市',
'赣州' => '赣州市',
'吉安' => '吉安市',
'宜春' => '宜春市',
'抚州' => '抚州市',
'上饶' => '上饶市',
'济南' => '济南市',
'青岛' => '青岛市',
'淄博' => '淄博市',
'枣庄' => '枣庄市',
'东营' => '东营市',
'烟台' => '烟台市',
'潍坊' => '潍坊市',
'济宁' => '济宁市',
'泰安' => '泰安市',
'威海' => '威海市',
'日照' => '日照市',
'临沂' => '临沂市',
'德州' => '德州市',
'聊城' => '聊城市',
'滨州' => '滨州市',
'菏泽' => '菏泽市',
'郑州' => '郑州市',
'开封' => '开封市',
'洛阳' => '洛阳市',
'安阳' => '安阳市',
'鹤壁' => '鹤壁市',
'新乡' => '新乡市',
'焦作' => '焦作市',
'濮阳' => '濮阳市',
'许昌' => '许昌市',
'漯河' => '漯河市',
'南阳' => '南阳市',
'商丘' => '商丘市',
'信阳' => '信阳市',
'周口' => '周口市',
'武汉' => '武汉市',
'黄石' => '黄石市',
'十堰' => '十堰市',
'宜昌' => '宜昌市',
'襄阳' => '襄阳市',
'鄂州' => '鄂州市',
'荆门' => '荆门市',
'孝感' => '孝感市',
'荆州' => '荆州市',
'黄冈' => '黄冈市',
'咸宁' => '咸宁市',
'随州' => '随州市',
'长沙' => '长沙市',
'株洲' => '株洲市',
'湘潭' => '湘潭市',
'衡阳' => '衡阳市',
'邵阳' => '邵阳市',
'岳阳' => '岳阳市',
'常德' => '常德市',
'益阳' => '益阳市',
'郴州' => '郴州市',
'永州' => '永州市',
'怀化' => '怀化市',
'娄底' => '娄底市',
'广州' => '广州市',
'韶关' => '韶关市',
'深圳' => '深圳市',
'珠海' => '珠海市',
'汕头' => '汕头市',
'佛山' => '佛山市',
'江门' => '江门市',
'湛江' => '湛江市',
'茂名' => '茂名市',
'肇庆' => '肇庆市',
'惠州' => '惠州市',
'梅州' => '梅州市',
'汕尾' => '汕尾市',
'河源' => '河源市',
'阳江' => '阳江市',
'清远' => '清远市',
'东莞' => '东莞市',
'中山' => '中山市',
'潮州' => '潮州市',
'揭阳' => '揭阳市',
'云浮' => '云浮市',
'南宁' => '南宁市',
'柳州' => '柳州市',
'桂林' => '桂林市',
'梧州' => '梧州市',
'北海' => '北海市',
'钦州' => '钦州市',
'贵港' => '贵港市',
'玉林' => '玉林市',
'百色' => '百色市',
'贺州' => '贺州市',
'河池' => '河池市',
'来宾' => '来宾市',
'崇左' => '崇左市',
'海口' => '海口市',
'三亚' => '三亚市',
'三沙' => '三沙市',
'儋州' => '儋州市',
'万州' => '万州区',
'涪陵' => '涪陵区',
'渝中' => '渝中区',
'江北' => '江北区',
'南岸' => '南岸区',
'北碚' => '北碚区',
'綦江' => '綦江区',
'大足' => '大足区',
'渝北' => '渝北区',
'巴南' => '巴南区',
'黔江' => '黔江区',
'长寿' => '长寿区',
'江津' => '江津区',
'合川' => '合川区',
'永川' => '永川区',
'南川' => '南川区',
'璧山' => '璧山区',
'铜梁' => '铜梁区',
'潼南' => '潼南区',
'荣昌' => '荣昌区',
'开州' => '开州区',
'梁平' => '梁平区',
'武隆' => '武隆区',
'城口' => '城口县',
'丰都' => '丰都县',
'垫江' => '垫江县',
'云阳' => '云阳县',
'奉节' => '奉节县',
'巫山' => '巫山县',
'巫溪' => '巫溪县',
'成都' => '成都市',
'自贡' => '自贡市',
'泸州' => '泸州市',
'德阳' => '德阳市',
'绵阳' => '绵阳市',
'广元' => '广元市',
'遂宁' => '遂宁市',
'内江' => '内江市',
'乐山' => '乐山市',
'南充' => '南充市',
'眉山' => '眉山市',
'宜宾' => '宜宾市',
'广安' => '广安市',
'达州' => '达州市',
'雅安' => '雅安市',
'巴中' => '巴中市',
'资阳' => '资阳市',
'贵阳' => '贵阳市',
'遵义' => '遵义市',
'安顺' => '安顺市',
'毕节' => '毕节市',
'铜仁' => '铜仁市',
'昆明' => '昆明市',
'曲靖' => '曲靖市',
'玉溪' => '玉溪市',
'保山' => '保山市',
'昭通' => '昭通市',
'丽江' => '丽江市',
'普洱' => '普洱市',
'临沧' => '临沧市',
'拉萨' => '拉萨市',
'昌都' => '昌都市',
'林芝' => '林芝市',
'山南' => '山南市',
'那曲' => '那曲市',
'西安' => '西安市',
'铜川' => '铜川市',
'宝鸡' => '宝鸡市',
'咸阳' => '咸阳市',
'渭南' => '渭南市',
'延安' => '延安市',
'汉中' => '汉中市',
'榆林' => '榆林市',
'安康' => '安康市',
'商洛' => '商洛市',
'兰州' => '兰州市',
'金昌' => '金昌市',
'白银' => '白银市',
'天水' => '天水市',
'武威' => '武威市',
'张掖' => '张掖市',
'平凉' => '平凉市',
'酒泉' => '酒泉市',
'庆阳' => '庆阳市',
'定西' => '定西市',
'陇南' => '陇南市',
'西宁' => '西宁市',
'海东' => '海东市',
'银川' => '银川市',
'吴忠' => '吴忠市',
'固原' => '固原市',
'中卫' => '中卫市',
'哈密' => '哈密市',
'石景山' => '石景山区',
'门头沟' => '门头沟区',
'滨海' => '滨海新区',
'石家庄' => '石家庄市',
'秦皇岛' => '秦皇岛市',
'张家口' => '张家口市',
'阿拉善' => '阿拉善盟',
'葫芦岛' => '葫芦岛市',
'哈尔滨' => '哈尔滨市',
'双鸭山' => '双鸭山市',
'佳木斯' => '佳木斯市',
'七台河' => '七台河市',
'牡丹江' => '牡丹江市',
'浦东' => '浦东新区',
'连云港' => '连云港市',
'马鞍山' => '马鞍山市',
'景德镇' => '景德镇市',
'平顶山' => '平顶山市',
'三门峡' => '三门峡市',
'驻马店' => '驻马店市',
'张家界' => '张家界市',
'防城港' => '防城港市',
'大渡口' => '大渡口区',
'沙坪坝' => '沙坪坝区',
'九龙坡' => '九龙坡区',
'攀枝花' => '攀枝花市',
'六盘水' => '六盘水市',
'日喀则' => '日喀则市',
'阿里' => '阿里地区',
'嘉峪关' => '嘉峪关市',
'石嘴山' => '石嘴山市',
'吐鲁番' => '吐鲁番市',
'喀什' => '喀什地区',
'和田' => '和田地区',
'塔城' => '塔城地区',
'呼和浩特' => '呼和浩特市',
'鄂尔多斯' => '鄂尔多斯市',
'呼伦贝尔' => '呼伦贝尔市',
'巴彦淖尔' => '巴彦淖尔市',
'乌兰察布' => '乌兰察布市',
'锡林郭勒' => '锡林郭勒盟',
'齐齐哈尔' => '齐齐哈尔市',
'乌鲁木齐' => '乌鲁木齐市',
'克拉玛依' => '克拉玛依市',
'阿克苏' => '阿克苏地区',
'阿勒泰' => '阿勒泰地区',
'大兴安岭' => '大兴安岭地区',
'甘孜' => '甘孜藏族自治州',
'凉山' => '凉山彝族自治州',
'楚雄' => '楚雄彝族自治州',
'大理' => '大理白族自治州',
'迪庆' => '迪庆藏族自治州',
'临夏' => '临夏回族自治州',
'甘南' => '甘南藏族自治州',
'海北' => '海北藏族自治州',
'黄南' => '黄南藏族自治州',
'海南' => '海南藏族自治州',
'果洛' => '果洛藏族自治州',
'玉树' => '玉树藏族自治州',
'昌吉' => '昌吉回族自治州',
'延边' => '延边朝鲜族自治州',
'石柱' => '石柱土家族自治县',
'怒江' => '怒江傈僳族自治州',
'伊犁' => '伊犁哈萨克自治州',
'阿坝' => '阿坝藏族羌族自治州',
'文山' => '文山壮族苗族自治州',
'西双版纳' => '西双版纳傣族自治州',
'博尔塔拉' => '博尔塔拉蒙古自治州',
'巴音郭楞' => '巴音郭楞蒙古自治州',
'恩施' => '恩施土家族苗族自治州',
'湘西' => '湘西土家族苗族自治州',
'秀山' => '秀山土家族苗族自治县',
'酉阳' => '酉阳土家族苗族自治县',
'彭水' => '彭水苗族土家族自治县',
'黔东南' => '黔东南苗族侗族自治州',
'黔南' => '黔南布依族苗族自治州',
'红河' => '红河哈尼族彝族自治州',
'德宏' => '德宏傣族景颇族自治州',
'海西' => '海西蒙古族藏族自治州',
'黔西南' => '黔西南布依族苗族自治州',
'克孜' => '克孜勒苏柯尔克孜自治州'
];
public function analysis($address = '')
{
$arr = [
'province' => '',
'city' => '',
'county' => ''
];
//$address = $request->post('address');
//省份匹配
$provincePri = implode('|', array_keys($this->province));
preg_match("/^({$provincePri})/U", $address, $pmatches);
if (empty($pmatches)) {
return false;
}
$arr['province'] = $this->province[$pmatches[0]];
//去掉省份
$address = $this->replaceProvince($pmatches[0], $address);
if (!$address) {
return $arr;
}
//匹配地级行政区 因为有 广州市 这个行政区,所以州要单独出来,并阻止贪婪
$cityPri = implode('|', array_keys($this->city));
preg_match("/^({$cityPri})/U", $address, $cmatches);
if (empty($cmatches)) {
return $arr;
}
$arr['city'] = $this->city[$cmatches[0]];
if ($arr['city'] == '朝阳') {
$arr['city'] = $arr['province'] == '北京市' ? '朝阳区' : '朝阳市';
}
//去掉地区行政区
$address = $this->replaceCity($cmatches[0], $address);
if (!$address) {
return $arr;
}
//匹配地级行政区 国为有 县区 市区 等三级 所以要使用贪婪
preg_match("/.*(区|县|旗|市)/", $address, $amatches);
if (empty($amatches)) {
return $arr;
}
$arr['county'] = $amatches[0];
return $arr;
}
/**
* 去掉省份
* @param type $province
* @param type $address
* @return type
*/
private function replaceProvince($province, $address)
{
$provinceSuffix = ['省', '市', '自治区', '特别行政区', '壮族自治区', '回族自治区', '维吾尔自治区'];
foreach ($provinceSuffix as $suffix) {
if (strpos($address, $province . $suffix) === 0) {
return str_replace($province . $suffix, '', $address);
}
}
return str_replace($province, '', $address);
}
/**
* 去掉地区行政区[或直辖市的区县]
* @param type $city
* @param type $address
* @return type
*/
private function replaceCity($city, $address)
{
// 土家族自治县 属于重庆,
$citySuffix = ['市', '区', '盟', '州', '地区', '自治州', '新区', '藏族自治州', '彝族自治州', '白族自治州', '回族自治州', '朝鲜族自治州', '土家族自治县', '傈僳族自治州', '哈萨克自治州', '藏族羌族自治州', '壮族苗族自治州', '傣族自治州', '蒙古自治州', '土家族苗族自治州', '土家族苗族自治县', '苗族侗族自治州', '布依族苗族自治州', '傣族景颇族自治州', '蒙古族藏族自治州', '苗族土家族自治县', '哈尼族彝族自治州', '勒苏柯尔克孜自治州'];
foreach ($citySuffix as $suffix) {
if (strpos($address, $city . $suffix) === 0) {
return str_replace($city . $suffix, '', $address);
}
}
return str_replace($city, '', $address);
}
}
发表评论 取消回复