日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

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

發布時間:2023/12/1 php 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php识别地址,实现地址自动识别实例(PHP) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

具體問題具體分析!代碼實現基于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);

}

}

})

}

整個過程簡單,又清晰明了,以上就是小編的代碼,分享給大家,覺得哪個地方不對勁的,歡迎留言吐槽!

總結

以上是生活随笔為你收集整理的php识别地址,实现地址自动识别实例(PHP)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。