参考:

1,《2020年5月中华人民共和国县以上行政区划代码》

2,《中华人民共和国行政区划》

省级行政区: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);
    }

}

点赞(3803) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部