PHP实现地址自动识别实例

址自动识别现在普遍,特别是用在快递填写地址,姓名,手机号码的时候,会把这些按照一定的规范填写后,点击自动识别后,会自动填写到各自的input 。最近也简单的实现了这个功能,给后台添加用户的时候,自动识别地址 。以下是效果图
 

PHP实现地址自动识别实例

文章插图
 
具体问题具体分析!代码实现基于laravel完成 。一个laravel完整的功能得具备这些:路由route,Model, View, Controller, 我这里用的有依赖注入服务容器等功能,当然,用到地址,你首先要有地址库 。。。
下面来看看是如何实现的,这里我只贴出核心代码
UsersController控制器
在这里新建构造函数,实现容器的依赖注入UsersRepository
/** @var UserRepository */private $userRepository;public function __construct(UsersRepository $userRepo){ $this->userRepository = $userRepo;} 
接下来就新建地址识别的方法, $discernDel 接收的数据是从前端传过来的,后面再贴前端代码 。业务代码处理交给容器UsersRepository里的方法getDiscern处理
/** * Function:地址识别 * Author:cyw0413 * @param Request $request * @return IlluminateContractsRoutingResponseFactory|IlluminateHttpResponse| * LaravelLumenHttpResponseFactory|SymfonyComponentHttpFoundationResponse */public function getDiscern(Request $request){ $discernDel = $request->input('discernDel'); try{ DB::beginTransaction(); $address = $this->userRepository->getDiscern($discernDel); DB::commit(); }catch (Exception $e){ DB::rollBack(); $msg = "信息提示:".$e->getMessage().",行:".$e->getLine(); return response(['code' => 0, 'msg'=>$msg]); } return response(['code'=>1,'msg'=>$address]); //地址识别完成}【PHP实现地址自动识别实例】 
来看看userRepository容器处理地址识别的各种业务代码
/** * Function:识别地址 * Author:cyw0413 */public function getDiscern($discernDel){ if (empty($discernDel)) { throw new Exception("请传入要识别的地址"); } $discernDel_left = explode ('[', $discernDel); if (!isset($discernDel_left[1])) { throw new Exception("你填写的地址规则错误,手机号码应该用[]"); } $discernDel_right = explode (']', $discernDel_left[1]); if (!isset($discernDel_right[1]) || empty($discernDel_right[1])) { throw new Exception("你填写的地址规则错误,手机号码应该用[]"); } $name = $discernDel_left[0]; if (empty($name)) { throw new Exception("你填写的姓名有误!"); } $mobile = $discernDel_right[0]; if (empty($mobile) || checkMobile($mobile) == 0) { throw new Exception("你填写的手机号码格式有误!"); } $address = trim ($discernDel_right[1]); if (empty($address)) { throw new Exception("你填写的地址不能为空"); } $var_address = $this->getAddressArrar($address); $var_address['name'] = $name; $var_address['mobile'] = $mobile; return $var_address;}上面的方法处理手机,名称,和地址处理,地址处理有些繁杂,因为有时候填写的地址有不一样的,比如广西省,有些就填写广西壮族自治区,所以getAddressArrar方法处理地址匹配信息,根据自己的业务做调整,如下
/** * Function:地址的处理 * Author:cyw0413 * @param $address * @return array * @throws Exception */function getAddressArrar($address){ // 获取所有地址递归列表 $regions = $this->getRegions(); // 初始化数据 $province = $city = $district = []; // 先查找省份-第一级地区 $province = $this->checkAddress($address, $regions); if($province){ $province_arr = ['110000','300000','404100','310000']; //4个市辖区如果地址不存在二级(市辖区,县),则特殊处理 if(!isset($province['region_code'])){ throw new Exception("请正确填写省份(市辖区)"); } // 查找城市-第二级地区 $city = $this->checkAddress($address, $province['list']); //这里只处理4个市辖区,可能还有多种情况,待发现 if(in_array($province['region_code'],$province_arr) && count($city['list']) == 0){ $city = $this->checkAddress('市辖区', $province['list']); if($city){ // 查找地区-第三级地区 $district = $this->checkAddress($address, $city['list']); //如果没有找到,则查找另外一个二级地区 if(!isset($district['region_code'])){ $city = $this->checkAddress('县', $province['list']); // 查找地区-第三级地区 $district = $this->checkAddress($address, $city['list']); } } }else{ if($city){ // 查找地区-第三级地区 $district = $this->checkAddress($address, $city['list']); } } }else{ //省份不填,报错误 throw new Exception("省份没填写,请检查"); } return $this->getAddressInfo($address, $province, $city, $district);}


推荐阅读