用php造了一个地址自动识别功能

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

具体问题具体分析!代码实现基于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:Mr.Zhou* @param Request $request* @return \Illuminate\Contracts\Routing\ResponseFactory|\Illuminate\Http\Response|* \Laravel\Lumen\Http\ResponseFactory|\Symfony\Component\HttpFoundation\Response*/
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]);   //地址识别完成}

来看看userRepository容器处理地址识别的各种业务代码

/*** Function:识别地址* Author:Mr.Zhou*/
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:Mr.Zhou* @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);
}
/*** 匹配正确的城市地址* Author:Mr.Zhou* @param $address* @param $city_list* @param int $force* @param int $str_len* @return array**/
function checkAddress($address, $city_list, $force=false, $str_len=2){$num = 0;$list = array();$result = array();// 遍历所有可能存在的城市foreach ($city_list as $city_key=>$city){$city_name = mb_substr($city['region_name'], 0, $str_len,'utf-8');// 判断是否存包含当前地址字符$city_arr = explode($city_name, $address);// 如果存在相关字眼,保存该地址的所有子地址if(count($city_arr) >= 2){// 必须名称长度同时达到当前比对长度if(strlen($city['region_name']) < $str_len){continue;}$num ++;if(isset($city['child'])){$list = $list + $city['child'];}$result[] = array('region_code' => $city_key,'region_name' => $city['region_name'],'list' =>$list,);}}// 如果有多个存在,则加大字符匹配长度if($num > 1 || $force){$region_name1 = $result[0]['region_name'];$region_name2 = $result[1]['region_name'];if(strlen($region_name1) == strlen($region_name2) && strlen($region_name1) == $str_len){$region_id1 = $result[0]['region_code'];$region_id2 = $result[1]['region_code'];$index = $region_id1 > $region_id2 ? 1 : 0;$result = $result[$index];return $result;}return $this->checkAddress($address, $city_list, $force, $str_len+1);} else {$result[0]['list'] = $list;return $result[0];}
}
/*** 根据原地址返回详细信息* Author:Mr.Zhou* @param $address* @param $province* @param $city* @param $area* @return array**/
function getAddressInfo($address, $province, $city, $district){// 查找最后出现的地址 - 截取详细信息if(!isset($province['region_name'])){throw new \Exception("请检查并正确填写省份(市辖区)");}if(!isset($city['region_name'])){throw new \Exception("请检查并正确填写城市");}if(!isset($district['region_name'])){throw new \Exception("请检查并正确填写区域(县/区/镇)");}$find_str = '';if($province['region_name']){$find_str = $province['region_name'];if($city['region_name']){$find_str = $city['region_name'];if(isset($district['region_name']) && $district['region_name']){$find_str = $district['region_name'];}}}// 截取详细的信息$find_str_len = mb_strlen($find_str,'utf-8');for($i=0; $i<$find_str_len-1; $i++){$substr = mb_substr($find_str,0,$find_str_len - $i, 'utf-8');$end_index = mb_strpos($address, $substr);if ($end_index){$address = mb_substr($address, $end_index + mb_strlen($substr) , mb_strlen($address) - $end_index);}}!empty($find_str) && $find_str = '|\S*' . $find_str;$area['info'] = preg_replace("/\s*|,|,|:|:{$find_str}/i", '', $address);if(empty($area['info'])){throw new \Exception("详细地址不存在,请检查");}return $address = ['province' => $province['region_code'],'city'     => $city['region_code'],'district' => $district['region_code'],'info'     => $area['info']];
}

前端html部分代码
基本上能看得懂的。jquery用到 getDiscern();方法,手机号码,姓名,地址等input这里就不一一列出了。大家根据下面的jquery都能想象到

<div class="form-group">{!! Form::label('discern', '自动识别地址:',['class' => 'control-label col-sm-2']) !!}<div class="col-sm-5">{!! Form::textarea('discern', '', ['class' => 'form-textarea form-control form-discern','rows' => 3]) !!}</div><div class="col-sm-3" style="height: 75px;"><button type="button" class="btn btn-info btn-sm discern" onclick="getDiscern();" >提交识别</button><small class="ruleGet" style="color: #676a74;">*查看模板</small></div></div>

jquery代码部分
ajax post后交给url:getDiscern 处理,这个就是上面controller的方法,success返回的数据后再追加到每个input里,最后再清除掉自动识别地址框的数据

/*** 地址识别* @returns {boolean}*/
function getDiscern(){var discernDel = $(".form-discern").val();if(!discernDel){alert("请输入要识别的地址");return false;}$.ajax({type: 'POST',url: "{!! route('admin.user.getDiscern') !!}",data: {'_token': csrf_token(),'discernDel': discernDel},dataType: 'json',timeout: 50000,success: function (res) {if (res.code == 1) {$("input[name='addr[linkman]']").val(res.msg.name);$("input[name='user_name']").val(res.msg.mobile);$("input[name='addr[address]']").val(res.msg.info);//触发change事件$('#province').val(res.msg.province).trigger('change');$('#city').val(res.msg.city).trigger('change');$('#area').val(res.msg.district).trigger('change');//识别后清除$(".form-discern").val("");} else {alert(res.msg);}}})}

整个过程简单,又清晰明了.

用php造了一个地址自动识别功能相关推荐

  1. 实现一个黑名单的功能,将指定来源的ip地址加入到黑名单,后续该ip地址访问服务器全部不予访问。

    实现一个黑名单的功能,将指定来源的ip地址加入到黑名单,后续该ip地址访问服务器全部不予访问. 结构: 代码: BlackListListener.java @WebListener("/c ...

  2. SSM实战-外卖项目-06-用户地址簿功能、菜品展示、购物车、下单(一个业务涉及5张表)

    文章目录 外卖项目-第六天 课程内容 1. 用户地址簿功能 1.1 需求分析 1.2 数据模型 1.3 导入功能代码 1.4 功能测试 (其实需求分析里我就自己写了一份代码,而且测试过了,下面再测试了 ...

  3. 通用权限管理系统组件 给信息管理系统加一个初始化的功能,调用存储过程

    系统初始化的运行效果如下: 参数表是为了防止反复被初始化的,防止关键数据丢失. 其实很多人都提过希望有系统初始化的功能,最近稍微空一些,就给系统增加了一个初始化的功能,给大家参考一下. 首先写了一个存 ...

  4. 通用权限管理系统组件 (GPM - General Permissions Manager) 给信息管理系统加一个初始化的功能,调用存储过程...

    系统初始化的运行效果如下: 参数表是为了防止反复被初始化的,防止关键数据丢失. 其实很多人都提过希望有系统初始化的功能,最近稍微空一些,就给系统增加了一个初始化的功能,给大家参考一下. 首先写了一个存 ...

  5. java webservice ip_通过Web Service实现IP地址查询功能的示例

    实例01 实现一个简单的Web服务访问 本实例将实现IP地址查询接口服务,根据用户传入的IP地址返回IP所在的省.市.地区,实例中将会用到IP地址库用于查询信息,由于数据较多,所以读者可在光盘资源文件 ...

  6. python编写登录_通过Python编写一个简单登录功能过程解析

    通过Python编写一个简单登录功能过程解析 需求: 写一个登录的程序, 1.最多登陆失败3次 2.登录成功,提示欢迎xx登录,今天的日期是xxx,程序结束 3.要检验输入是否为空,账号和密码不能为空 ...

  7. 通过HttpModule实现IP地址屏蔽功能

    此前本想在网上找找实现Asp.Net的IP地址屏蔽功能的文章来参考,但是一搜索"IP 屏蔽 asp.net",出现的全都是: 这些都是对我此前写的<细说Asp.net的IP地 ...

  8. 路由器的地址转换功能

    首先,我们先了解一下地址转换功能出现的背景.所谓地址,就是用来识别每一台设备的标志,因此每台设备都应该有一个唯一不重复的地址,就好像如果很多人的地址都一样,那么快递员就不知道该把包裹送给谁了.网络也是 ...

  9. 通过Web Service实现IP地址查询功能

    实例01  实现一个简单的Web服务访问 本实例将实现IP地址查询接口服务,根据用户传入的IP地址返回IP所在的省.市.地区,实例中将会用到IP地址库用于查询信息,由于数据较多,所以读者可在光盘资源文 ...

最新文章

  1. 计算机显示器不清楚跟电池有关系吗,电脑液晶显示器显像模糊是什么原因
  2. java中的final, finally, finalize的区别
  3. 记录一次K8s-Flannel插件的坑
  4. 中控指纹采集器开发指纹识别项目(说明)
  5. python 查找算法_python快速查找算法应用实例
  6. 【转】Wireshark网络抓包(二)——过滤器
  7. 问题 D: 寻求勾股数
  8. AI发来贺电,您的2333号奶牛已进入恋爱时节 | 野性的呼唤
  9. PHP面向对象设计模式-姜海强-专题视频课程
  10. log4j日志级别配置详解
  11. 云网融合个人浅析(一)
  12. 用分区大师无损增加C盘空间
  13. Python运用循环实现模拟登录
  14. 什么是土壤电阻率,它如何影响防雷接地
  15. 监控显示登录服务器超时,监控连接服务器超时怎么解决
  16. 背景渐变色,兼容IE
  17. HDMI之EDID使用说明
  18. 拼多多退款怎么设置?万顿思教育
  19. Matlab利用函数句柄实现函数嵌套
  20. Android 加密 AES

热门文章

  1. Miniconda, ImportError: DLL load failed while importing win32api
  2. 甘特图(别名:横道图、条状图)的画法
  3. gabor与gabor小波
  4. Rocky Linux更换yum源为国内源
  5. 使用Openoffice实现并发多进程word文档转换预览
  6. mini6410移植全攻略(5)--uboot移植之支持nand flansh启动(下)
  7. CPU检测工具:CPU-Z快捷键大全(绿色)
  8. 处理器cpu测试工具
  9. 计算机中软件和硬件的简单介绍
  10. OOM问题原理解析(四):Bitmap压缩方案总结