php识别地址,实现地址自动识别实例(PHP)

fdf5d6638d76?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

具体问题具体分析!代码实现基于laravel完成。一个laravel完整的功能得具备这些:路由route,Model, View, Controller, 我这里用的有依赖注入服务容器等功能,当然,用到地址,你首先要有地址库。。。

下面来看看是如何实现的,这里我只贴出核心代码

UsersController控制器

在这里新建构造函数,实现容器的依赖注入UsersRepository

/**@varUserRepository */

private$userRepository;

publicfunction__construct(UsersRepository $userRepo)

{

$this->userRepository = $userRepo;

}

接下来就新建地址识别的方法, $discernDel接收的数据是从前端传过来的,后面再贴前端代码。  业务代码处理交给容器UsersRepository里的方法getDiscern处理

/**

* Function:地址识别

* Author:cyw0413

*@paramRequest $request

*@returnIlluminateContractsRoutingResponseFactory|IlluminateHttpResponse|

* LaravelLumenHttpResponseFactory|SymfonyComponentHttpFoundationResponse

*/

publicfunctiongetDiscern(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();

returnresponse(['code'=>0,'msg'=>$msg]);

}

returnresponse(['code'=>1,'msg'=>$address]);//地址识别完成

}

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

/**

* Function:识别地址

* Author:cyw0413

*/

publicfunctiongetDiscern($discernDel)

{

if(empty($discernDel)) {

thrownewException("请传入要识别的地址");

}

$discernDel_left = explode ('[', $discernDel);

if(!isset($discernDel_left[1])) {

thrownewException("你填写的地址规则错误,手机号码应该用[]");

}

$discernDel_right = explode (']', $discernDel_left[1]);

if(!isset($discernDel_right[1]) ||empty($discernDel_right[1])) {

thrownewException("你填写的地址规则错误,手机号码应该用[]");

}

$name = $discernDel_left[0];

if(empty($name)) {

thrownewException("你填写的姓名有误!");

}

$mobile = $discernDel_right[0];

if(empty($mobile) || checkMobile($mobile) ==0) {

thrownewException("你填写的手机号码格式有误!");

}

$address = trim ($discernDel_right[1]);

if(empty($address)) {

thrownewException("你填写的地址不能为空");

}

$var_address =$this->getAddressArrar($address);

$var_address['name'] = $name;

$var_address['mobile'] = $mobile;

return$var_address;

}

上面的方法处理手机,名称,和地址处理,地址处理有些繁杂,因为有时候填写的地址有不一样的,比如广西省,有些就填写广西壮族自治区,所以getAddressArrar方法处理地址匹配信息,根据自己的业务做调整,如下

/**

* Function:地址的处理

* Author:cyw0413

*@param$address

*@returnarray

*@throwsException

*/

functiongetAddressArrar($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'])){

thrownewException("请正确填写省份(市辖区)");

}

// 查找城市-第二级地区

$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{

//省份不填,报错误

thrownewException("省份没填写,请检查");

}

return$this->getAddressInfo($address, $province, $city, $district);

}

/**

* 匹配正确的城市地址

*@param$address

*@param$city_list

*@paramint $force

*@paramint $str_len

*@returnarray

**/

functioncheckAddress($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

*@returnarray

**/

functiongetAddressInfo($address, $province, $city, $district){

// 查找最后出现的地址 - 截取详细信息

if(!isset($province['region_name'])){

thrownewException("请检查并正确填写省份(市辖区)");

}

if(!isset($city['region_name'])){

thrownewException("请检查并正确填写城市");

}

if(!isset($district['region_name'])){

thrownewException("请检查并正确填写区域(县/区/镇)");

}

$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'])){

thrownewException("详细地址不存在,请检查");

}

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}

*/

functiongetDiscern(){

vardiscernDel = $(".form-discern").val();

if(!discernDel){

alert("请输入要识别的地址");

returnfalse;

}

$.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);

}

}

})

}

整个过程简单,又清晰明了,以上就是小编的代码,分享给大家,觉得哪个地方不对劲的,欢迎留言吐槽!

fdf5d6638d76?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367469.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kubernetes cpu限制参数说明

docker CPU限制参数 Option Description --cpus<value> Specify how much of the available CPU resources a container can use. For instance, if the host machine has two CPUs and you set --cpus"1.5", the container is guaranteed at most one and …

Java 8备忘单中的可选

Java 8 java.util.Optional<T>是scala.Option[T]和Data.Maybe在Haskell中的较差表亲。 但这并不意味着它没有用。 如果您不熟悉此概念&#xff0c;请将Optional想象为可能包含或不包含某些值的容器。 就像Java中的所有引用都可以指向某个对象或为null &#xff0c; Optio…

让 Chrome 崩溃的一行 CSS 代码

一般的 CSS 代码只会出现 UI 版式或者兼容性方面的小问题。但这里我们要分享一行有趣的 CSS&#xff0c;它可以直接让你的 Chrome 页面挂掉 :) 复现 在 Chrome 里打开一个稍复杂的页面&#xff0c;比如知乎或者掘金打开开发者工具&#xff0c;为页面 <body> 增加样式 s…

用Vue Node从零开始实现拼多多前后端商城项目 — 记录踩坑之旅(上篇)

前言 本人移动端开发妹子工程师一枚 &#xff0c;因为公司项目需要用到前端的技术(主要是vue)&#xff0c;自己自学了一段时间&#xff0c;最近花了半个月在工作之余的时间终于自己完完整整写下来一整个前后端商城项目(当然是跟了一个线上项目直播班&#xff0c;不要嘲笑我)&am…

系统重装助手教你如何在Microsoft Edge中恢复“关闭所有选项卡”警告

在Microsoft Edge中&#xff0c;当您打开多个选项卡时&#xff0c;浏览器将显示“您要关闭所有选项卡吗&#xff1f;” 警告&#xff0c;以防止您意外关闭重要标签。 通常&#xff0c;在没有第二个想法的情况下&#xff0c;您会立即禁用此功能&#xff0c;检查提示中的“始终关…

受JAAS保护的JAX-RS端点

随着RESTFUL&#xff08;JAX-RS&#xff09;作为创建Web服务端点的“首选”方式的问世&#xff0c;很长一段时间以来&#xff0c;我一直想知道人们如何围绕它实现安全机制。 归根结底&#xff0c;我假设JAX-RS的基础实现是servlet&#xff0c;因此其安全性也可能围绕容器&…

前端必须懂的计算机网络知识—(跨域、代理、本地存储)

前端必须懂的计算机网络知识系列文章&#xff1a; DNS服务器和跨域问题计算机网络的分层模型IP地址和MAC地址前端必须懂的计算机网络知识—(跨域、代理、本地存储)前端必须懂的计算机网络知识—(TCP)前端必须懂的计算机网络知识—(HTTP)前端必须懂的计算机网络知识—(XSS、CSR…

php canvas 前端JS压缩,获取图片二进制流数据并上传

<?php if(isset($_GET[upload]) && $_GET[upload] img){//二进制数据流$data file_get_contents ( php://input ); // 不需要php.ini设置&#xff0c;内存压力小if(empty($data)){$data gzuncompress ( $GLOBALS [HTTP_RAW_POST_DATA] ); // 需要php.ini设…

cordova监听事件中调用其他方法_Laravel模型事件的实现原理详解

模型事件在 Laravel 的世界中&#xff0c;你对 Eloquent 大多数操作都会或多或少的触发一些模型事件&#xff0c;下面这篇文章主要给大家介绍了关于Laravel模型事件的实现原理&#xff0c;文中通过示例代码介绍的非常详细&#xff0c;需要的朋友可以参考借鉴。前言Laravel的ORM…

【译】10个有趣的JSCSS库(2018.10)

Tutorialzine每月都会给我们精心挑选优秀的web开发资源&#xff0c;这些资源可以帮助我们解锁最新和最炫酷的网络开发姿势。前端er,让我们一起先睹为快吧&#xff01; WatermelonDB WatermelonDB是用于构建React和React Native应用程序的下一代数据库。快速&#xff0c;高度可…

自定义分页器

好久没来写东西那&#xff01;今天写个自定义分页器给大家参考下吧 首先我们在自己创建的Django项目的app下新建一个utils文件夹&#xff0c;用来放我们的分页器组件 简单说下分页器实现原理&#xff1a; 1.利用ORM查询语句的限制数据条数来确定每页显示的数据 2.设置我们每页显…

五 Vue学习 首页学习 (上)

首页&#xff1a; http://localhost:8002/#/&#xff0c; 登录页面如下&#xff1a; index.js文件中如下的路由配置&#xff0c;转过去看login.vue是如何实现的。 const routes [ { path: /, component: login },&#xff08;这里一个问题&#xff1a; logi…

linux下mqm添加用户,Linux 下MQ的安装和配置亲测

开篇之前奉上几条黄金链接&#xff1a;MQ参考文档http://publib.boulder.ibm.com/infocenter/wmqv7/v7r0m0/index.jsp?topic%2Fcom.ibm.mq.doc%2Fhelp_home_wmq.htmhttp://www-01.ibm.com/support/docview.wss?uidswg27006467MQ下载地址&#xff1a;http://www-03.ibm.com/so…

小程序tabbar这套方案全搞定!

关于微信小程序的tarbar&#xff0c;相信你们都不会陌生 在实现小程序微信原装的tabbar却比较呆板&#xff0c;不够精致&#xff0c;往往不符合自己的要求 这个时候怎么办呢 这套方案接着&#xff01; 先简单的来说一下主要思想:自定义字体图标组件以及tabbar组件&#xff0c…

linux服务器用哪个面板好,Linux服务器管理面板哪家比较好用?

Linux服务器管理面板哪家比较好用&#xff1f;发布时间&#xff1a;2020-07-21 06:08:33来源&#xff1a;51CTO阅读&#xff1a;261作者&#xff1a;BirdCloud_1022现在&#xff0c;越来越多的站长朋友都会选择服务器用来搭建网站&#xff0c;但是势必需要我们自己搭建WEB环境&…

spring boot(一)入门

目录 spring boot(一)入门一、简介1、微服务的概念2、什么是spring boot3、快速入门4.springboot的快捷部署spring boot(一)入门 一、简介 1、微服务的概念 说起spring boot&#xff0c;我们不得不说一下“微服务”一词的兴起&#xff0c;微服务一词最早起源于2014年&#xff0…

Linux usb bus日志如何打开,从linux usb bus节点来认识usb linux usb认识

首先从linux dmesg来认识usb:<6>[ 19.610046] msm_hsic_host msm_hsic_host: Qualcomm EHCI Host Controller using HSIC<6>[ 19.620391] msm_hsic_host msm_hsic_host: new USB bus registered, assigned bus number 1<6>[ 19.659942] msm_hsic_host …

Spring面试问题

还可以查看我们最新的文章69Spring面试问答-最终名单 。 1&#xff09;什么是春天&#xff1f; 回答&#xff1a; Spring是控件和面向方面的容器框架的轻量级转换。 2&#xff09;解释春天&#xff1f; 回答&#xff1a; 轻巧&#xff1a;在尺寸和透明度方面&#xff0c; S…

201771010120 苏浪浪 《面向对象程序设计(java)》第二周学习总结

理论知识总结 第三章Java基本程序设计结构 1、基本知识&#xff1a;&#xff08;1&#xff09;标识符&#xff1a;是由字母、下划线、美元符号和数字组成&#xff0c;且第一个符号不能为数字。&#xff08;2&#xff09;关键字&#xff1a;剧啊语言中被赋予特定意义的一些单词。…

Apache Camel简介

Apache Camel是著名的企业集成模式的开源实现。 Camel是一个路由和中介引擎&#xff0c;可以帮助开发人员以各种领域特定语言&#xff08;DSL&#xff09;&#xff08;例如Java&#xff0c;Spring / XML&#xff0c;scala等&#xff09;创建路由和中介规则。 骆驼用途广泛 Cam…