新聞資訊  快訊  焦點  財經  政策  社會
互 聯 網   電商  金融  數據  計算  技巧
生活百科  科技  職場  健康  法律  汽車
手機百科  知識  軟件  修理  測評  微信
軟件技術  應用  系統  圖像  視頻  經驗
硬件技術  知識  技術  測評  選購  維修
網絡技術  硬件  軟件  設置  安全  技術
程序開發  語言  移動  數據  開源  百科
安全防護  資訊  黑客  木馬  病毒  移動
站長技術  搜索  SEO  推廣  媒體  移動
財經百科  股票  知識  理財  財務  金融
教育考試  育兒  小學  高考  考研  留學
您當前的位置:首頁 > IT百科 > 程序開發 > 語言 > php

PHP實現地址自動識別實例

時間:2019-06-17 14:57:04  來源:  作者:

址自動識別現在普遍,特別是用在快遞填寫地址,姓名,手機號碼的時候,會把這些按照一定的規范填寫后,點擊自動識別后,會自動填寫到各自的input。最近也簡單的實現了這個功能,給后臺添加用戶的時候,自動識別地址。以下是效果圖

 

實現地址自動識別實例(<a href=http://www.encras.tw/it/cxkf/yy/php/ target=_blank class=infotextkey>php</a>)

 

具體問題具體分析!代碼實現基于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 IlluminateContractsRoutingResponseFactory|IlluminateHttpResponse|
 * LaravelLumenHttpResponseFactory|SymfonyComponentHttpFoundationResponse
 */
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']) < $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];
 }
}

 

/**
 * 根據原地址返回詳細信息
 * @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);
 }
 }
 })

}

 

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



Tags:PHP   點擊:()  評論:()
聲明:本站部分內容來自互聯網,內容觀點僅代表作者本人,如有任何版權侵犯請與我們聯系,我們將立即刪除。
▌相關評論
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
▌相關推薦
統計的時候有需求,需要生成日期數組:$data_arr = [&#39;2018-08-08&#39; => 0,&#39;2018-08-09&#39; => 0,&#39;2018-08-10&#39; => 0,...];php中可以借助一下函數:生成日期數...【詳細內容】
2019-10-10   PHP  點擊:(1)  評論:(0)  加入收藏
php中有時從數據庫中查詢出來的記錄有一些相同字段重復的需要過濾,該函數可以起到作用:/*** 二維數組通過key去重** @param $array* @param $key** @return array*/protected...【詳細內容】
2019-10-10   PHP  點擊:(2)  評論:(0)  加入收藏
(1)、 插入數據并且返回當前插入的自增ID $db = Db::name(&#39;user&#39;); $id = $db->insertGetId([&#39;password&#39;=>&#39;123&#39;,&#39;username&#39;=>&#39;888&#...【詳細內容】
2019-10-10   PHP  點擊:(2)  評論:(0)  加入收藏
場景:某網站需要對其項目做一個投票系統,投票項目上線后一小時之內預計有100萬用戶進行投票,希望用戶投票完就能看到實時的投票情況這個場景可以使用redis+mysql冷熱數據交換來...【詳細內容】
2019-10-10   PHP  點擊:(1)  評論:(0)  加入收藏
ThinkAdmin V5 是一個基于 ThinkPHP 5.1 開發的后臺管理系統。我們致力于二次開發底層框架,提供完整的組件及API,基于此框架可以快速開發應用。另外項目安裝及二次開發可以參...【詳細內容】
2019-10-09   PHP  點擊:(3)  評論:(0)  加入收藏
重點講講redis方式的 session 共享方式,此方式也是博主推薦方式。網站業務規模和訪問量的逐步發展,原本由單臺服務器、單個域名的迷你網站架構已經無法滿足發展需要。此時我...【詳細內容】
2019-10-08   PHP  點擊:(3)  評論:(0)  加入收藏
前面 IT三國 跟大家分享了『PhpStudy V8.0新版本介紹及下載安裝的圖文教程』,今天我們就以建立 ZBlogPHP 站點為例說明一下 PhpStudy V8.0 是如何建立網站的?1、前往ZBlog 官...【詳細內容】
2019-10-08   PHP  點擊:(26)  評論:(0)  加入收藏
在平常工作開發中,我們通常需要開發出PC端和移動端兩個不同的系統,從而根據訪問端的不同進入到不同的操作界面中。這就需要我們首先要對訪問的客戶端進行判斷是PC端還是移動...【詳細內容】
2019-10-08   PHP  點擊:(7)  評論:(0)  加入收藏
設計模式不僅代表著更快開發健壯軟件的有用方法,而且還提供了以友好的術語封裝大型理念的方法。例如,您可以說您正在編寫一個提供松散耦合的消息傳遞系統,也可以說你正在編寫名...【詳細內容】
2019-10-08   PHP  點擊:(2)  評論:(0)  加入收藏
php 高并發解決思路解決方案,如何應對網站大流量高并發情況。本文為大家總結了常用的處理方式,但不是細節,后續一系列細節教程給出。希望大家喜歡。一 高并發的概念在互聯網時...【詳細內容】
2019-10-08   PHP  點擊:(3)  評論:(0)  加入收藏
PHP的數組非常多變。你可以把它當作映射使用,也可以當作集合使用,甚至可以當作數據對象使用……如果你很勇敢,甚至可以把它當作數組使用!...【詳細內容】
2019-10-08   PHP  點擊:(4)  評論:(0)  加入收藏
1. php 與 多線程php的多線程,對于phper是一個較冷門的知識。相信很多工作了很多年的程序員,沒用過php多線程的大有人在。所以可以認為php是單線程。多線程示意2. php是單線程...【詳細內容】
2019-10-08   PHP  點擊:(8)  評論:(0)  加入收藏
bug沒有愛安裝Nginx1.安裝軟件包epel-release并更新,它會幫我們自動配置好yum的軟件倉庫。yum -y install epel-releaseyum update2.安裝nginx,一般的項目不建議wget下載包編...【詳細內容】
2019-09-29   PHP  點擊:(6)  評論:(0)  加入收藏
對于一些剛接觸php的新手來說,肯定會遇到這樣的問題。php的常量名區分大小寫么?php的自定義函數區分大小寫么?php的類名區分大小寫么?關于這些問題,本篇文章就來詳細的介紹總結一...【詳細內容】
2019-09-27   PHP  點擊:(5)  評論:(0)  加入收藏
語音識別功能現在已經很普遍,用PHP如何實現語音識別功能呢?這些功能都需要有一定的技巧,接下來,由IT培訓網來詳細描述一下,用PHP語言如何實現語音識別功能。 PHP如何實現語音識...【詳細內容】
2019-09-26   PHP  點擊:(9)  評論:(0)  加入收藏
文檔說明:1.將waf.php傳到要包含的文件的目錄2.在頁面中加入防護,有兩種做法,根據情況二選一即可:a).在所需要防護的頁面加入代碼1require_once(&#39;waf.php&#39;);就可以做到...【詳細內容】
2019-09-26   PHP  點擊:(10)  評論:(0)  加入收藏
FastCgi是通訊協議,可以通過Unix套接字或者Tcp進行通訊.Nginx內置基本模塊FastCgi模塊(控制緩存區大小等功能)Nginx通過FastCgi技術和外部的服務或者工具一起工作.Php自己能...【詳細內容】
2019-09-26   PHP  點擊:(3)  評論:(0)  加入收藏
網站上面部署ssl證書的站點越來越大,但有很多集成式的web服務器無法按照一般站點的配置來部署ssl證書,現在,卓趣科技就以集成式phpstudy為例(apache+mysql),為大家展示一下正確的s...【詳細內容】
2019-09-25   PHP  點擊:(12)  評論:(0)  加入收藏
由于項目要求,需要利用php做一個獲取遠程頁面html狀態碼的功能,用來判斷遠程頁面是否可以訪問,就類似那種HTML頁面狀態碼檢測工具一樣。整理了一下代碼,貼出來。有需要的可以拿...【詳細內容】
2019-09-25   PHP  點擊:(3)  評論:(0)  加入收藏
PSR 是 PHP Standard Recommendations 的簡寫,由 PHP FIG 組織制定的 PHP 規范,是 PHP 開發的實踐標準。目前已表決通過了 6 套標準,已經得到大部分 PHP 框架的支持和認可。 PS...【詳細內容】
2019-09-25   PHP  點擊:(1)  評論:(0)  加入收藏
推薦資訊
相關文章
欄目更新
欄目熱門
31选7开奖11185