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 …

工业机器人用铸铁牌号_常用铸铁牌号

常用铸铁的牌号、组织与性能常用铸铁的牌号、组织与性能铸铁中的石墨形态、尺寸以及分布状况对性能影响很大。铸铁中石墨状况主要受铸铁的化学成分及工艺过程的影响。铸铁中石墨形态(片状或球状)在铸造后即形成&#xff1b;也可将白口铸铁通过退火&#xff0c;让其中部分或全部…

浏览器拦截打开新窗口情况总结

在打开一个新窗口时&#xff0c;由于浏览器的安全机制&#xff0c;用户未始终允许的情况下&#xff0c;可能会触发到浏览器拦截&#xff0c;无法正常直接弹出。 网上有很多给出解决方案的只言片语&#xff0c;不够全面&#xff0c;所以针对自己遇到的问题做了详细的情况分析。…

什么叫组件化开发

1、https://www.zhihu.com/question/29735633 &#xff08;什么叫组件化开发&#xff09;转载于:https://www.cnblogs.com/smght/p/8694229.html

php5.5 session,(五)ThinkPHP实践之Session驱动-TTLSA

Session驱动是指Session在thinkphp中的存储驱动&#xff0c;通过不同的方式&#xff0c;可以将Session存储在不同的“容器”中对Session有兴趣的的朋友可以查阅相关资料&#xff0c;本篇仅针对thinkphp的session驱动进行讲解一、DB驱动知识点&#xff1a;1、thinkphp框架默认DB…

Java 8备忘单中的可选

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

SQL Server2012 安装方法

请看 https://blog.csdn.net/monkeybrothers/article/details/78021848转载于:https://www.cnblogs.com/nanqiang/p/9596528.html

卡方线性趋势检验_SPSS:趋势卡方检验

SPSS&#xff1a;趋势卡方检验毕业季接近尾声&#xff0c;通过答辩的各位同学们即将开始新的旅程。回顾论文点滴&#xff0c;想必既有心酸又充满欣慰。回顾毕业生咨询论文写作得到一个启示与各位分享&#xff1a;论文完成的过程也是还原临床研究的过程&#xff0c;论文收集资料…

让 Chrome 崩溃的一行 CSS 代码

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

oracle块空间的使用,Oracle管理存储架构(二)--Oracle管理数据块空间

1、数据块的概念数据块是数据库中最小的分配单元&#xff0c;块是数据库使用的最小的I/O单元&#xff0c;由一个或多个操作系统block组成。数据块由block header 、free space 、data 组成&#xff0c;oracle 10g 标准块是8k&#xff0c;支持2~32k。块头&#xff1a;包含块地址…

在JBoss 7中使用HA Singleton

不久前&#xff0c;我不得不更改Quartz Scheduler的标准集群行为&#xff0c;并使其能够在不同步数据库的情况下工作。 当然&#xff0c;有很多选择可以做到这一点&#xff0c;但是由于我是简单性的忠实拥护者&#xff0c;因此我决定使用标准的Spring Scheduled配置&#xff0c…

软件目录结构规范

软件目录结构规范 为什么要设计好目录结构? "设计项目目录结构"&#xff0c;就和"代码编码风格"一样&#xff0c;属于个人风格问题。对于这种风格上的规范&#xff0c;一直都存在两种态度: 一类同学认为&#xff0c;这种个人风格问题"无关紧要"…

软件工程的基本步骤

&#xff11;问题定义 问题定义阶段必须回答的关键问题&#xff1a;“要解决的问题是什么&#xff1f;”如果不知道问题是什么就试图解决这个问题&#xff0c;显然是盲目的&#xff0c;只会白白浪费时间和金钱&#xff0c;最终得出 的结果很可能是毫无意义的。尽管确切地定义问…

matlab norm函数使用_matlab norm(a-b)

(示例: X(1:10,1:10)zeros(10,10),LX[X,X;X,X]) Matlab 中冒号(: )的使用方法小结: (1)用于生成向量,a:b,一般要求 a一、matlab 基本操作 Matlab 概率论与数理统计 1. ...概率密度函数 1 (1) 均匀分布:unifpdf(x,a,b)...{X 3}, p1normcdf(5,3,2)- normcdf(2,3,......[A B];rank…

解决MyEclipse JAVA EE无法识别Base64问题

第一步&#xff1a;右击项目选择Build Path,选择Configure Build Path第二步:点击JRE System Library选择右边的Edit第三步&#xff1a;选择Alternate JRE,点击Install JREs第四步&#xff1a;移出原有的MyEclipse自带的 JRE&#xff0c;&#xff08;选中后点击remove&#xff…

JavaFX的响应式设计

使用CSS技术&#xff0c;为您的网站创建响应式设计相对容易。 根据屏幕的大小&#xff0c;您可以使用其他CSS文件和布局。 在JavaFX中&#xff0c;乍一看这似乎有点困难&#xff0c;因为CSS仅负责样式&#xff0c;而不负责布局。 但是&#xff0c;为各个屏幕尺寸使用不同的FXML…

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

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

python自动补全库_这个库厉害了,自动补全Python代码,节省50%敲码时间

近日&#xff0c;Reddit 上的一篇帖子引起了网友的热议。帖子作者「mlvpj」称&#xff1a;「我们使用深度学习完成了一个简单的项目&#xff0c;可以自动进行 Python 代码补全。」根据介绍&#xff0c;该项目基于 LSTM 模型&#xff0c;训练后&#xff0c;负责对代码的缺失部分…

matlab 小波 cdd,[Matlab] 单导联心电数据的小波(包)消噪及压缩

% 用小波(包)对MitbihCmprTstExample_08730_01(软硬阈值)进行消噪与压缩clear all;clc;close all;disp(用小波(包)对MitbihCmprTstExample_08730_01(软硬阈值)进行消噪和压缩);load MitbihCmprTstExample_08730_01.mat;countlength(sig);xsig(:,1); ysig(:,2); zsig(:,3);TSx(2…

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

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