在laravel專案中根據IP取得省市名稱

藏色散人
發布: 2020-12-22 09:20:34
轉載
1894 人瀏覽過

根據ip

獲取地理定位,曾嘗試了

laravel在laravel專案中根據IP取得省市名稱

torann/geoip

包,不是很準確。還有百度 API呼叫取得地理資訊的方法,為了減少維護成本,最後用了thinkphp3.2中的一個包,是否是tp框架自帶的不很清楚。這個包獲取定位的原理是內建了省市資料庫UTFWry.dat

laravel 專案如何使用

根据 IP 获取省市名称我放在了專案

app

同級目錄sdk下。為了能夠使用,

composer.json

中需將IpLocation.class.php加入到classmap自動載入中,以便該檔案中包含的類別能夠在被調用時被自動加載(如果不太明白為何能自動加載,請參考Laravel Composer 自動加載原理)。

"autoload": { "classmap": [ "database/seeds", "database/factories", "sdk/Org/Net/IpLocation.class.php" ]},
登入後複製
新增後執行composer dump-autoload

基本上使用

$ip = new \Org\Net\IpLocation('UTFWry.dat'); $location = $ip->getlocation('223.104.1.100'); dd($location);
登入後複製
##1. 標準傳回值

我們拿廣東深圳的ip 做範例
# 打印结果 array:5 [ "ip" => "223.104.1.100" "beginip" => "223.104.1.0" "endip" => "223.104.1.255" "country" => "广东省深圳市" "area" => "移动"]
登入後複製

2. 個別地區回傳值有所不同,左邊為示範ip,右邊為回傳地區名稱

# 直辖市 '223.104.3.155',//北京市 '223.104.7.155',//天津市 '223.104.25.155',//重庆市 '223.104.5.200',//上海市徐汇区 # 自治区 '223.104.15.100',//内蒙古呼和浩特市 '223.104.29.100',//宁夏银川市 '223.104.30.100',//新疆乌鲁木齐市 '211.139.74.100',//西藏拉萨市 '218.204.63.100',//广西百色市 '1.32.192.100',//香港 '60.246.49.100',//澳门
登入後複製
封裝一個傳回地區id的方法函數

常使用的話,一般喜歡放在

app\Helpers.php中,

getlocation($ip); $location = $location['country']; //广东省深圳市 // 如果没有查询到的默认返回值 $default = ['p_id'=>1,'c_id'=>0,'locname'=>'北京']; // 如果有市 那么市后边的字符删除 只保留到市 $city_strpos = mb_strpos($location, '市'); if($city_strpos){ $location = mb_substr($location, 0, $city_strpos + 1); } // 如果是直辖市,若匹配到直接返回,不继续匹配 “区” $spacial = ['北京','上海','天津','重庆'];//北京市/天津市/重庆市/上海市徐汇区 foreach ($spacial as $bj) { if( strpos($location, $bj) !== false ){ $province_name = $bj; $province_id = DB::table('loc_province')->where('name',$province_name)->value('province_id'); return ['p_id'=>$province_id,'c_id'=>0,'locname'=>$bj.'市']; } } // 其他标准查询 $expect_ids = [36,37,38,39,69]; //排除北京、、以及想要排除的地区 $province_name = $city_name = ''; //初始化 $province_id = $city_id = 0; // 所有省数据 $all_province = DB::table('loc_province')->whereNotIn('id', $expect_ids)->get(); foreach ($all_province as $prov) { $name = $prov->name; $prov_pos = mb_strpos($location, $name); // 如果匹配到目标 if( $prov_pos !== false ){ $province_id = $prov->province_id; $province_name = $name; // 从字符串中去除省名称,并把省字去掉 $location = mb_substr($location, $prov_pos + mb_strlen($name)); $location = str_replace('省','',$location); // 如果有“市”,那么就提取出市的名称 if($location && mb_strpos($location, '市')){ $city_name = rtrim($location, '市'); } if($city_name){ $city_id = DB::table('loc_city')->where('name',$city_name)->value('cid'); }else{ $city_id = 1; // 默认省会 } break; } } if($province_name){ return ['p_id'=>$province_id,'c_id'=>$city_id,'locname'=>$province_name.$city_name]; }else{ return $default; } }
登入後複製

#測試

$testips = [ '223.104.3.155',//北京市 '223.104.7.155',//天津市 '223.104.25.155',//重庆市 '223.104.5.200',//上海市徐汇区 '223.104.15.100',//内蒙古呼和浩特市 '223.104.29.100',//宁夏银川市 '223.104.30.100',//新疆乌鲁木齐市 '211.139.74.100',//西藏拉萨市 '218.204.63.100',//广西百色市 '1.32.192.100',//香港 '60.246.49.100',//澳门 '223.104.1.100', //广东省深圳市 ]; echo "
"; foreach ($testips as $ip) { print_r(get_ip_location($ip)); }
登入後複製
檢查結果
Array ( [p_id] => 1 [c_id] => 0 [locname] => 北京市 ) Array ( [p_id] => 3 [c_id] => 0 [locname] => 天津市 ) Array ( [p_id] => 4 [c_id] => 0 [locname] => 重庆市 ) Array ( [p_id] => 2 [c_id] => 0 [locname] => 上海市 ) Array ( [p_id] => 7 [c_id] => 1 [locname] => 内蒙古呼和浩特 ) Array ( [p_id] => 29 [c_id] => 1 [locname] => 宁夏银川 ) Array ( [p_id] => 31 [c_id] => 1 [locname] => 新疆乌鲁木齐 ) Array ( [p_id] => 26 [c_id] => 1 [locname] => 西藏拉萨 ) Array ( [p_id] => 21 [c_id] => 13 [locname] => 广西百色 ) Array ( [p_id] => 32 [c_id] => 1 [locname] => 香港 ) Array ( [p_id] => 33 [c_id] => 1 [locname] => 澳门 ) Array ( [p_id] => 20 [c_id] => 2 [locname] => 广东深圳 )
登入後複製
原文網址:https://learnku.com/articles/52456

#

# ##

以上是在laravel專案中根據IP取得省市名稱的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:learnku.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!