在这篇文章中,我们将为您详细介绍在laravel项目中根据IP获取省市名称的内容,并且讨论关于laravel获取客户端ip的相关问题。此外,我们还会涉及一些关于ASP.NET实现根据IP获取省市地址的
在这篇文章中,我们将为您详细介绍在laravel项目中根据IP获取省市名称的内容,并且讨论关于laravel获取客户端ip的相关问题。此外,我们还会涉及一些关于ASP.NET实现根据IP获取省市地址的方法、Chart.js在Laravel项目中的应用示例、java 根据 ip 地址获取省市、Laravel学习第一天(创建laravel项目、路由、视图、blade模板),laravelblade的知识,以帮助您更全面地了解这个主题。
本文目录一览:- 在laravel项目中根据IP获取省市名称(laravel获取客户端ip)
- ASP.NET实现根据IP获取省市地址的方法
- Chart.js在Laravel项目中的应用示例
- java 根据 ip 地址获取省市
- Laravel学习第一天(创建laravel项目、路由、视图、blade模板),laravelblade
在laravel项目中根据IP获取省市名称(laravel获取客户端ip)
下面由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
中,
<?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] => 广东深圳 )
原文地址:https://learnku.com/articles/52456
ASP.NET实现根据IP获取省市地址的方法
本文实例讲述了ASP.NET实现根据IP获取省市地址的方法,分享给大家供大家参考。具体实现方法如下:
1、在网站的跟路径下面添加QQWry.dat(点击此处本站下载https://www.jb51.net/softs/10529.html)文件,这个文件是IP数据库文件
2、添加以下一个类 IPScanner
{
//私有成员#region 私有成员
private string dataPath;
private string ip;
private string country;
private string local;
private long firstStartIp = 0;
private long lastStartIp = 0;
private FileStream objfs = null;
private long startIp = 0;
private long endIp = 0;
private int countryFlag = 0;
private long endIpOff = 0;
private string errMsg = null;
//构造函数#region 构造函数
public IPScanner()
{
this.dataPath = System.Web.HttpContext.Current.Server.MapPath("/ipdata/QQWry.dat");
}
//公共属性#region 公共属性
public string DataPath
{
set { dataPath = value; }
}
public string IP
{
set { ip = value; }
}
public string Country
{
get { return country; }
}
public string Local
{
get { return local; }
}
public string ErrMsg
{
get { return errMsg; }
}
//搜索匹配数据#region 搜索匹配数据
private int QQwry()
{
string pattern = @"(((\\d{1,2})|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))\\.){3}((\\d{1,2})|(1\\d{2})|(2[0-4]\\d)|(25[0-5]))";
Regex objRe = new Regex(pattern);
Match objMa = objRe.Match(ip);
if (!objMa.Success)
{
this.errMsg = "IP格式错误";
return 4;
}
long ip_Int = this.IpToInt(ip);
int nRet = 0;
if (ip_Int >= IpToInt("127.0.0.0") && ip_Int <= IpToInt("127.255.255.255"))
{
this.country = "本机内部环回地址";
this.local = "";
nRet = 1;
}
else if ((ip_Int >= IpToInt("0.0.0.0") && ip_Int <= IpToInt("2.255.255.255")) || (ip_Int >= IpToInt("64.0.0.0") && ip_Int <= IpToInt("126.255.255.255")) || (ip_Int >= IpToInt("58.0.0.0") && ip_Int <= IpToInt("60.255.255.255")))
{
this.country = "网络保留地址";
this.local = "";
nRet = 1;
}
objfs = new FileStream(this.dataPath, FileMode.Open, FileAccess.Read);
try
{
objfs.Position = 0;
byte[] buff = new Byte[8];
objfs.Read(buff, 0, 8);
firstStartIp = buff[0] + buff[1] * 256 + buff[2] * 256 * 256 + buff[3] * 256 * 256 * 256;
lastStartIp = buff[4] * 1 + buff[5] * 256 + buff[6] * 256 * 256 + buff[7] * 256 * 256 * 256;
long recordCount = Convert.ToInt64((lastStartIp - firstStartIp) / 7.0);
if (recordCount <= 1)
{
country = "FileDataError";
objfs.Close();
return 2;
}
long rangE = recordCount;
long rangB = 0;
long recNO = 0;
while (rangB < rangE - 1)
{
recNO = (rangE + rangB) /2;
this.GetStartIp(recNO);
if (ip_Int ==this.startIp)
{
rangB = recNO;
break;
}if (ip_Int >this.startIp)
rangB = recNO;
else
rangE = recNO;
}this.GetStartIp(rangB);
this.GetEndIp();
if (this.startIp <= ip_Int &&this.endIp >= ip_Int)
{
this.GetCountry();
this.local =this.local.Replace("(我们一定要解放台湾!!!)", "");
}else{
nRet =3;
this.country ="未知";
this.local ="";
}
objfs.Close();
return nRet;
}catch{
return1;
}
}// IP地址转换成Int数据#region IP地址转换成Int数据 privatelong IpToInt(string ip)
{
char[] dot =newchar[] { ''.'' };
string[] ipArr = ip.Split(dot);
if (ipArr.Length ==3)
ip = ip +".0";
ipArr = ip.Split(dot);
long ip_Int =0;
long p1 =long.Parse(ipArr[0]) *256*256*256;
long p2 =long.Parse(ipArr[1]) *256*256;
long p3 =long.Parse(ipArr[2]) *256;
long p4 =long.Parse(ipArr[3]);
ip_Int = p1 + p2 + p3 + p4;
return ip_Int;
}//获取起始IP范围#region 获取起始IP范围 privatelong GetStartIp(long recNO)
{
long offSet = firstStartIp + recNO *7;
//objfs.Seek(offSet,SeekOrigin.Begin); objfs.Position = offSet;
byte[] buff =new Byte[7];
objfs.Read(buff, 0, 7);
endIpOff = Convert.ToInt64(buff[4].ToString()) + Convert.ToInt64(buff[5].ToString()) *256+ Convert.ToInt64(buff[6].ToString()) *256*256;
startIp = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) *256+ Convert.ToInt64(buff[2].ToString()) *256*256+ Convert.ToInt64(buff[3].ToString()) *256*256*256;
return startIp;
}// 获取结束IP#region 获取结束IP privatelong GetEndIp()
{
//objfs.Seek(endIpOff,SeekOrigin.Begin); objfs.Position = endIpOff;
byte[] buff =new Byte[5];
objfs.Read(buff, 0, 5);
this.endIp = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) *256+ Convert.ToInt64(buff[2].ToString()) *256*256+ Convert.ToInt64(buff[3].ToString()) *256*256*256;
this.countryFlag = buff[4];
returnthis.endIp;
}//获取国家/区域偏移量#region 获取国家/区域偏移量 privatestring GetCountry()
{
switch (this.countryFlag)
{
case1:
case2:
this.country = GetFlagStr(this.endIpOff +4);
this.local = (1==this.countryFlag) ?"" : this.GetFlagStr(this.endIpOff +8);
break;
default:
this.country =this.GetFlagStr(this.endIpOff +4);
this.local =this.GetFlagStr(objfs.Position);
break;
}return"";
}//获取国家/区域字符串#region 获取国家/区域字符串 privatestring GetFlagStr(long offSet)
{
int flag =0;
byte[] buff =new Byte[3];
while (1==1)
{
objfs.Position = offSet;
flag = objfs.ReadByte();
if (flag ==1|| flag ==2)
{
objfs.Read(buff, 0, 3);
if (flag ==2)
{
this.countryFlag =2;
this.endIpOff = offSet -4;
}
offSet = Convert.ToInt64(buff[0].ToString()) + Convert.ToInt64(buff[1].ToString()) *256+ Convert.ToInt64(buff[2].ToString()) *256*256;
}else{
break;
}
}if (offSet <12)
return"";
objfs.Position = offSet;
return GetStr();
}//GetStr#region GetStr privatestring GetStr()
{
byte lowC =0;
byte upC =0;
string str ="";
byte[] buff =newbyte[2];
while (1==1)
{
lowC = (Byte)objfs.ReadByte();
if (lowC ==0)
break;
if (lowC >127)
{
upC = (byte)objfs.ReadByte();
buff[0] = lowC;
buff[1] = upC;
System.Text.Encoding enc = System.Text.Encoding.GetEncoding("GB2312");
str += enc.GetString(buff);
}else{
str += (char)lowC;
}
}return str;
}publicstring IPLocation(string ip)
{
this.ip = ip;
this.QQwry();
if (this.country.Trim().Contains(this.local.Trim()))
returnthis.country.Trim();
returnthis.country.Trim() +this.local.Trim();
}
}
3、ASP.NET根据IP获取省市地址的调用
IPScanner ipscaner = new IPScanner();
ipscaner.IPLocation(ip);
string strIPAddress=ipscaner.Country;