您好,登錄后才能下訂單哦!
這篇文章主要介紹在laravel項目中根據IP獲取省市名稱的方法,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!
根據 ip
獲取地理定位,曾嘗試了 laravel
的torann/geoip
包,不是很準確。還有 百度 API
調用獲取地理信息的方法,為了減少維護成本,最終用了thinkphp3.2
中的一個包,是否是tp框架自帶的不很清楚。這個包獲取定位的原理是內置了省市數據庫 UTFWry.dat
。
我放在了項目 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',//澳門
經常使用的話,一般喜歡放在 app\Helpers.php
中,
<?php function get_ip_location($ip){ $ip_driver = new \Org\Net\IpLocation('UTFWry.dat'); $location = $ip_driver->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 "<pre>"; 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] => 廣東深圳 )
以上是“在laravel項目中根據IP獲取省市名稱的方法”這篇文章的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。