在laravel项目中根据IP获取省市名称

2022-05-15 0 948

下面由Laravel框架教程栏目给大家介绍根据IP获取省市名称的方法,希望对需要的朋友有所帮助!

在laravel项目中根据IP获取省市名称

根据 ip 获取地理定位,曾尝试了 laraveltorann/geoip 包,不是很准确。还有 百度 API 调用获取地理信息的方法,为了减少维护成本,最终用了thinkphp3.2 中的一个包,是否是tp框架自带的不很清楚。这个包获取定位的原理是内置了省市数据库 UTFWry.dat

在laravel项目中根据IP获取省市名称

laravel 项目如何使用

我放在了项目 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 中,

<?phpfunction 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] => 广东深圳)

原文地址:https://learnku.com/articles/52456

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

【声明:根据2013年1月30日《计算机软件保护条例》2次修订第17条规定: 为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存 储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬! 鉴于此,也希望大家按此说明研究软件!】
本站所有源码尽量保证原汁原味,如有特殊情况会作出声明及标注,网站资源不做任何二次加密(原版加密除外,不影响程序使用的不会做解密处理),方便您更好的学习参考。 在您的能力范围内,为了大环境的良性发展,请尽可能的选择正版资源。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

即刻码站__国内靠谱的站长资源下载平台 php教程 在laravel项目中根据IP获取省市名称 https://www.jike1995.com/36309.html

常见问题
  • 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用
查看详情
  • 最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度
查看详情

相关文章

发表评论
暂无评论
官方客服团队

为您解决烦忧 - 24小时在线 专业服务