下面由Laravel框架教程栏目给大家介绍根据IP获取省市名称的方法,希望对需要的朋友有所帮助!
根据 ip 获取地理定位,曾尝试了 laravel的torann/geoip 包,不是很准确。还有 百度 API 调用获取地理信息的方法,为了减少维护成本,最终用了thinkphp3.2 中的一个包,是否是tp框架自带的不很清楚。这个包获取定位的原理是内置了省市数据库 UTFWry.dat。
laravel 项目如何使用
我放在了项目 app 同级目录 sdk 下。为了能够使用,composer.json 中需将 IpLocation.class.php 添加到 classmap 自动加载中,以便该文件中包含的类能够在被调用时被自动加载(如果不太明白为何能自动加载,参考 Laravel Composer 自动加载原理)。
1
2
3
4
5
6
"autoload": {
"classmap": [
"database/seeds",
"database/factories",
"sdk/Org/Net/IpLocation.class.php"
]},
添加后执行 composer dump-autoload
基本使用
1
2
3
$ip = new \Org\Net\IpLocation('UTFWry.dat');
$location = $ip->getlocation('223.104.1.100');
dd($location);
1. 标准返回值
我们拿 广东深圳 的 ip 做示例
1
2
3
4
5
6
7
# 打印结果
array:5 [
"ip" => "223.104.1.100"
"beginip" => "223.104.1.0"
"endip" => "223.104.1.255"
"country" => "广东省深圳市"
"area" => "移动"]
2. 个别地区返回值有所不同,左侧为示范ip,右侧为返回地区名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 直辖市
'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 中,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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;
}
}
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$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)); } 检查结果 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 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] => 广东深圳 )