地址自动识别现在普遍,特别是用在快递填写地址,姓名,手机号码的时候,会把这些按照一定的规范填写后,点击自动识别后,会自动填写到各自的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:cyw0413

* @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: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);

}

/**

* 匹配正确的城市地址

* @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'])

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];

}

}

/**

* 根据原地址返回详细信息

* @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

$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都能想象到

{!! Form::label('discern', '自动识别地址:',['class' => 'control-label col-sm-2']) !!}

{!! Form::textarea('discern', '', ['class' => 'form-textarea form-control form-discern','rows' => 3]) !!}

提交识别

*查看模板

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自动识别电话名字地址,你用PHP,如何实现地址自动识别的功能相关推荐

  1. 处理苹果IOS手机safari 浏览器自动识别电话并且黑化样式的问题

    处理苹果IOS手机safari 浏览器自动识别电话并且黑化样式的问题,今天突然打开我们的推广落地页发现电话没显示,仔细看才发现样式被黑化了,2种方式处理: 问题如图,细节很小但很重要. 1,在头部增加 ...

  2. 【计算机网络】有了 IP 地址,为什么还要用 MAC 地址?

    [计算机网络]有了 IP 地址,为什么还要用 MAC 地址? 简单的说就是ip是个框架,定义的时候有些东西并没有考虑到,以太网只定义1~2层(物理层.数据链路层),IP和TCP分别定义了3.4层(网络 ...

  3. 弘辽科技:淘宝能查出来访客ip地址吗?访客ip地址怎么查?

    每个人在上网的时候使用的设备都会有一个IP地址,那么有一些朋友经常在淘宝平台上下单购物,所以现在心里很好奇的是淘宝能查出来访客IP地址吗?自己的信息会被泄露吗? 可以. 淘宝卖家是可以看到买家的地址的 ...

  4. 有了 IP 地址,为什么还要用 MAC 地址?

    我认为,IP地址和MAC地址可以类比生活中寄快递的过程. 在整个网络中数据被封装成数据报文进行发送,就像我们生活中寄快递时将物品放进包裹中.而数据在路由器之间的跳转也可以看作是不同地区快递小哥对物流的 ...

  5. c语言相邻地址相差多少,C语言内存地址基础

    从计算机内存的角度思考C语言中的一切东东,是挺有帮助的.我们可以把计算机内存想象成一个字节数组,内存中每一个地址表示 1 字节.比方说我们的电脑有 4K 内存,那这个内存数组将会有 4096 个元素. ...

  6. ipv6地址分类 java_IPv6的本地联网地址计算方法详解

    IPv6的世界里,如果DHCP6和SLACC这两位大佬都为没有为可怜的网卡分配IP地址,也没有人为网卡设置静态的IP地址,系统就会为网卡计算一个IPv6的网址来.这样的网址只能在本地使用,不得路由,所 ...

  7. 服务器站点地址是什么意思,云服务器地址是什么意思

    IP地址就是给每个连接在互联网上的主机分配的一个地址.现在的IP地址主要分为 ipv4和 一般登录 由于有这种地址,才保证了用户在连网的计算机上操作时,能够高效而且方便地从千千万万台计算机中选出所需的 ...

  8. 国内和国外DNS服务器地址 全国各地电信DNS服务器地址

    国内和国外DNS服务器地址 全国各地电信DNS服务器地址 北京:202.96.199.133  202.96.0.133 202.106.0.20 202.106.148.1 202.97.16.19 ...

  9. 地址池命令 思科理由_思科交换机DHCP功能和使用简介

    一.DHCP server功能: DHCP可以动态的为其管辖下的主机分配地址.DHCP协议报文是UDP报文,DHCP使用67(客户端)和68(服务器)端口.首先,客户端(例 如我们PC的网卡)在其所在 ...

  10. IP反查网站,ip反查接口,旁站查询接口大全,通过IP查域名汇总,域名历史解析记录查询,IP地址查对应机房名称、地址,查IP地址的AS号码...

    IP反查网站,ip反查接口,旁站查询接口大全,通过IP查域名汇总: http://bgp.he.net/,IP地址查对应机房:IP地址在 bgp.he.net 直接能查到IP所属机房或运营商的AS号. ...

最新文章

  1. HTML初级知识点总结(2)
  2. 到底什么时候该使用MQ 1
  3. linux如何配置网络设置_如何在Linux中配置网络
  4. 实战演练丨SCN太大引发ORA-600[2252]
  5. Mongo db 与mysql 语法比较
  6. 车辆销售系统用例_使用OpenCV和Python构建自己的车辆检测模型
  7. 沃达丰V1210刷机教程
  8. 基础篇:数据库 SQL 入门教程
  9. 2022 Moonriver全球黑客松优胜项目名单
  10. AtCoder Beginner Contest 156 D Bouquet 失之交臂 容斥原理+二项式定理+乘法逆元+快速幂+模后负数 多余担心
  11. hutool压缩文件
  12. css字体设置为白色,css怎么将字体设置成白色
  13. 一个萌新的学习如何写BUG记录(学无止境,更无止境)
  14. 浅谈AI绘图工具Midjourney
  15. 利用网校源码进行网校系统开发可以解决哪些问题
  16. 2021中国薪酬指南:全球半数雇主计划加薪并恢复至正常招聘水平
  17. 玩转Android之Activity详细剖析
  18. 智慧物联下主机加固如何理解?
  19. 360网站卫士的IP段添加进服务器的白名单中
  20. 互联网的战争--腾讯与360

热门文章

  1. C语言中性别比例怎么表示,Problem G: C语言实验--算算男生女生的比例
  2. css网站变灰色代码
  3. 最新《择善教育》C/C++黑客编程项目实战教程
  4. 构造非支配解集(Python)
  5. 机场安检 matlab实现,机场安检过程改进的方案.doc
  6. Xcode 10.1 安装模拟器无反应:点击create 无反应
  7. 笔记本电脑WIFI图标消失解决方案大全,无WIFI图标也能自由连WIFI上网。
  8. 汽车软件架构学习笔记(一):九问软件架构
  9. NLP学习路径(三):NLP中文分词技术
  10. maya表情blendshape_【UE4】人物角色MorphTarget(Blendshape) 面部表情制作方案