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

发布时间 - 2020-12-11 00:00:00    点击率:

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

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

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 中,

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  # php  # composer  # json  # 封装  # class  # 数据库  # https  # 重庆市  # 天津市  # 徐汇区  # 上海市  # 北京市  # 拉萨市  # 百色市  # 银川市  # 呼和浩特市  # 广东省 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】  ,网页ppt怎么弄成自己的ppt?  移动端脚本框架Hammer.js  个人网站制作流程图片大全,个人网站如何注销?  Linux系统命令中screen命令详解  如何在万网主机上快速搭建网站?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  Laravel Pest测试框架怎么用_从PHPUnit转向Pest的Laravel测试教程  如何在自有机房高效搭建专业网站?  如何快速搭建高效可靠的建站解决方案?  JavaScript数据类型有哪些_如何准确判断一个变量的类型  WordPress 子目录安装中正确处理脚本路径的完整指南  如何快速打造个性化非模板自助建站?  如何在服务器上配置二级域名建站?  如何自定义safari浏览器工具栏?个性化设置safari浏览器界面教程【技巧】  Bootstrap整体框架之CSS12栅格系统  如何用低价快速搭建高质量网站?  高端建站三要素:定制模板、企业官网与响应式设计优化  电商网站制作价格怎么算,网上拍卖流程以及规则?  微信推文制作网站有哪些,怎么做微信推文,急?  Laravel怎么实现模型属性的自动加密  Laravel怎么集成Vue.js_Laravel Mix配置Vue开发环境  在centOS 7安装mysql 5.7的详细教程  如何快速生成橙子建站落地页链接?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  Laravel怎么配置不同环境的数据库_Laravel本地测试与生产环境动态切换【方法】  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel如何处理和验证JSON类型的数据库字段  HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】  HTML 中动态设置元素 name 属性的正确语法详解  高防服务器租用指南:配置选择与快速部署攻略  百度输入法ai组件怎么删除 百度输入法ai组件移除工具  如何快速搭建高效WAP手机网站吸引移动用户?  JavaScript Ajax实现异步通信  Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤  如何快速搭建高效简练网站?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  Laravel如何创建自定义中间件?(Middleware代码示例)  如何在局域网内绑定自建网站域名?  nodejs redis 发布订阅机制封装实现方法及实例代码  三星网站视频制作教程下载,三星w23网页如何全屏?  JavaScript实现Fly Bird小游戏  手机网站制作平台,手机靓号代理商怎么制作属于自己的手机靓号网站?  HTML 中如何正确使用模板变量为元素的 name 属性赋值  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  制作旅游网站html,怎样注册旅游网站?  Python3.6正式版新特性预览  网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?