在laravel项目中根据IP获取省市名称
发布时间 - 2020-12-11 00:00:00 点击率:次下面由Laravel框架教程栏目给大家介绍根据IP获取省市名称的方法,希望对需要的朋友有所帮助!
根据 ip 获取地理定位,曾尝试了 laravel的torann/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 】
相关推荐:
百度输入法ai组件怎么删除 百度输入法ai组件移除工具
EditPlus中的正则表达式 实战(4)
如何用IIS7快速搭建并优化网站站点?
使用C语言编写圣诞表白程序
Bootstrap CSS布局之列表
如何正确下载安装西数主机建站助手?
如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体
Laravel请求验证怎么写_Laravel Validator自定义表单验证规则教程
微信小程序 闭包写法详细介绍
edge浏览器无法安装扩展 edge浏览器插件安装失败【解决方法】
Python函数文档自动校验_规范解析【教程】
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
Laravel怎么连接多个数据库_Laravel多数据库连接配置
齐河建站公司:营销型网站建设与SEO优化双核驱动策略
Laravel如何部署到服务器_线上部署Laravel项目的完整流程与步骤
详解Android——蓝牙技术 带你实现终端间数据传输
如何正确选择百度移动适配建站域名?
Android滚轮选择时间控件使用详解
无锡营销型网站制作公司,无锡网选车牌流程?
Laravel Seeder填充数据教程_Laravel模型工厂Factory使用
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
文字头像制作网站推荐软件,醒图能自动配文字吗?
Android仿QQ列表左滑删除操作
弹幕视频网站制作教程下载,弹幕视频网站是什么意思?
Laravel安装步骤详细教程_Laravel环境搭建指南
高防网站服务器:DDoS防御与BGP线路的AI智能防护方案
iOS UIView常见属性方法小结
ChatGPT 4.0官网入口地址 ChatGPT在线体验官网
如何用AWS免费套餐快速搭建高效网站?
Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程
Midjourney怎样加参数调细节_Midjourney参数调整技巧【指南】
Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)
Laravel如何生成和使用数据填充?(Seeder和Factory示例)
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】
制作公司内部网站有哪些,内网如何建网站?
Laravel Fortify是什么,和Jetstream有什么关系
如何在IIS中新建站点并配置端口与IP地址?
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
如何在阿里云虚拟主机上快速搭建个人网站?
魔方云NAT建站如何实现端口转发?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
中山网站制作网页,中山新生登记系统登记流程?
Python3.6正式版新特性预览
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
Laravel怎么清理缓存_Laravel optimize clear命令详解
详解Android中Activity的四大启动模式实验简述
如何在企业微信快速生成手机电脑官网?
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
上一篇:《盗墓笔记手游》角色排行一览
上一篇:《盗墓笔记手游》角色排行一览


}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;
}
}