PHP判断IP并转跳到相应城市分站的方法

 这篇文章主要介绍了PHP判断IP并转跳到相应城市分站的方法,实例分析了php解析URL及跳转的技巧,具有一定参考借鉴价值,需要的朋友可以参考下

 
 

本文实例讲述了PHP判断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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144

<?php
class QQWry{
var $StartIP=0;
var $EndIP=0;
var $Country='';
var $Local='';
var $CountryFlag=0;
// 标识 Country位置
// 0x01,随后3字节为Country偏移,没有Local
// 0x02,随后3字节为Country偏移,接着是Local
// 其他,Country,Local,Local有类似的压缩。可能多重引用。
var $fp;
var $FirstStartIp=0;
var $LastStartIp=0;
var $EndIpOff=0 ;
function getStartIp($RecNo){
$offset=$this->FirstStartIp+$RecNo * 7 ;
@fseek($this->fp,$offset,SEEK_SET) ;
$buf=fread($this->fp ,7) ;
$this->EndIpOff=ord($buf[4])+(ord($buf[5])*256)+(ord($buf[6])*256*256);
$this->StartIp=ord($buf[0])+(ord($buf[1])*256)+(ord($buf[2])*256*256)+(ord($buf[3])*256*256*256);
return $this->StartIp;
}
function getEndIp(){
@fseek ( $this->fp , $this->EndIpOff , SEEK_SET ) ;
$buf=fread ( $this->fp , 5 ) ;
$this->EndIp=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256);
$this->CountryFlag=ord ( $buf[4] ) ;
return $this->EndIp ;
}
function getCountry(){
switch ( $this->CountryFlag ) {
case 1:
case 2:
$this->Country=$this->getFlagStr ( $this->EndIpOff+4) ;
//echo sprintf('EndIpOffset=(%x)',$this->EndIpOff );
$this->Local=( 1 == $this->CountryFlag )? '' : $this->getFlagStr ( $this->EndIpOff+8);
break ;
default :
$this->Country=$this->getFlagStr ($this->EndIpOff+4);
$this->Local=$this->getFlagStr ( ftell ( $this->fp ));
}
}
function getFlagStr ($offset){
$flag=0 ;
while(1){
@fseek($this->fp ,$offset,SEEK_SET) ;
$flag=ord(fgetc($this->fp ) ) ;
if ( $flag == 1 || $flag == 2 ) {
$buf=fread ($this->fp , 3 ) ;
if ($flag==2){
$this->CountryFlag=2;
$this->EndIpOff=$offset - 4 ;
}
$offset=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])* 256*256);
}
else{
break ;
}
}
if($offset<12)
return '';
@fseek($this->fp , $offset , SEEK_SET ) ;
 
return $this->getStr();
}
function getStr ( )
{
$str='' ;
while ( 1 ) {
$c=fgetc ( $this->fp ) ;
//echo "$cn" ;
if(ord($c[0])== 0 )
break ;
$str.= $c ;
}
//echo "$str n";
return $str ;
}
function qqwry ($dotip='') {
if( !is_string($dotip) || $dotip==''){return;}
if(preg_match("/^127/",$dotip)){$this->Country="本地网络";return ;}
elseif(preg_match("/^192/",$dotip)) {$this->Country="局域网";return ;}
$nRet;
$ip=$this->IpToInt ( $dotip );
$this->fp= fopen(__QQWRY__, "rb");
if ($this->fp == NULL) {
$szLocal= "OpenFileError";
return 1;
}
@fseek ( $this->fp , 0 , SEEK_SET );
$buf=fread ( $this->fp , 8 );
$this->FirstStartIp=ord($buf[0]) + (ord($buf[1])*256) + (ord($buf[2])*256*256) + (ord($buf[3])*256*256*256);
$this->LastStartIp=ord($buf[4]) + (ord($buf[5])*256) + (ord($buf[6])*256*256) + (ord($buf[7])*256*256*256);
$RecordCount= floor(($this->LastStartIp - $this->FirstStartIp) / 7);
if ($RecordCount <= 1){
$this->Country="FileDataError";
fclose($this->fp) ;
return 2 ;
}
$RangB= 0;
$RangE= $RecordCount;
// Match ...
while ($RangB < $RangE-1)
{
$RecNo= floor(($RangB + $RangE) / 2);
$this->getStartIp ( $RecNo ) ;
if ( $ip == $this->StartIp )
{
$RangB=$RecNo ;
break ;
}
if ($ip>$this->StartIp)
$RangB= $RecNo;
else
$RangE= $RecNo;
}
$this->getStartIp ( $RangB ) ;
$this->getEndIp ( ) ;
if ( ( $this->StartIp <= $ip ) && ( $this->EndIp >= $ip ) ){
$nRet=0 ;
$this->getCountry ( ) ;
//这样不太好..............所以..........
$this->Local=str_replace("area error", "",$this->Local);
}
else{
$nRet=3 ;
$this->Country='未知' ;
$this->Local='' ;
}
fclose ( $this->fp );
$this->Country=preg_replace("/(CZ88.NET)|(纯真网络)/","局域网/未知",$this->Country);
$this->Local=preg_replace("/(CZ88.NET)|(纯真网络)/","局域网/未知",$this->Local);
//////////////看看 $nRet在上面的值是什么0和3,于是将下面的行注释掉
return $nRet ;
//return "$this->Country $this->Local";#如此直接返回位置和国家便可以了
}
function IpToInt($Ip) {
$array=explode('.',$Ip);
$Int=($array[0] * 256*256*256) + ($array[1]*256*256) + ($array[2]*256) + $array[3];
return $Int;
}
}
?>

实例演示如下:

?

1
2
3
4

$QQWry=new QQWry;
$QQWry->QQWry("60.31.95.255");
$country = $QQWry->Country;
echo $QQWry->Country.",".$QQWry->Local;

希望本文所述对大家的php程序设计有所帮助。

时间: 2024-11-05 14:59:48

PHP判断IP并转跳到相应城市分站的方法的相关文章

PHP判断IP并转跳到相应城市分站的方法_php技巧

本文实例讲述了PHP判断IP并转跳到相应城市分站的方法.分享给大家供大家参考.具体实现方法如下: <?php class QQWry{ var $StartIP=0; var $EndIP=0; var $Country=''; var $Local=''; var $CountryFlag=0; // 标识 Country位置 // 0x01,随后3字节为Country偏移,没有Local // 0x02,随后3字节为Country偏移,接着是Local // 其他,Country,Local

根据访问者IP显示或跳转到地区分站

根据IP来判断, 就会根据访问者的IP自动跳转到访问者所在城市的地区分站参考代码如下: Function lookaddress(sip)    Dim str1, str2, str3, str4    Dim num    Dim irs    If IsNumeric(Left(sip, 2)) Then        If sip = "127.0.0.1" Then sip = "192.168.0.1"        str1 = Left(sip, I

php判断ip黑名单程序代码实例

 这篇文章主要介绍了php判断ip黑名单程序代码实例,需要的朋友可以参考下 学校的新闻系统要求有些新闻只开放校内ip浏览,于是重写了一个代码来实现此功能,实现后的结果是,只要把允许访问的ip列入ip.txt这个文件中即可,同时支持c类ip,例如:   ip.txt 192.168 211.67.188 211.67.191.25 代码如下:    代码如下: /* * ip地址黑名单.白名单 * 判断访客地址的ip是否在ip.txt中,支持c类ip * By xhat */   $ip = $_

巧用PHP正则表达式判断IP地址

学习PHP时,你可能会遇到判断PHP正则表达式问题,这里将介绍PHP正则表达式问题的解决方法,在这里拿出来和大家分享一下.在一些查询网站和搜索引擎,常常用到判断某字符串是否为标准的IP地址. 比如在百度里搜索某IP地址,会显示该IP的信息,而不符合标准的IP地址是不显示IP信息的.这时就要判断该字符串是否为标准的IP了,最常用的方法是用PHP正则表达式判断.在网上搜了一些判断IP地址的正则,都是过于简单的,有的只是判断IP字段不大于255,其实还有很多需要判断的,比如只能是数字,且不能为负数,还

判断IP的来源是电信还是网通

判断ip的来源是电信还是网通,常用于站点的后台程序.典型的做法当然是查询数据库教程,数据库里保存着网通(或电信)的ip范围,然后通过范围搜索来决定该ip是否在网通(或电信)的区间内.不过每次都得查询数据库,效率显然很低. 不多废话,直接开始说一种超快的算法吧.既然要极快,莫过于o(1)的复杂度,所以开辟一巨大的缓冲区,用经典的空间换时间,通过查表一步即可判定.那如何定义表的大小,还有key?先从cnc.txt这个文件看起.(http://www.3lian.com/) 这个文件是中国网通的路由表

Shell脚本实现判断IP地址是否在一个ip段内代码分享

  这篇文章主要介绍了Shell脚本实现判断IP地址是否在一个ip段内代码分享,本文直接给出实现代码,需要的朋友可以参考下 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 cat ipcalc.sh #!/bin/bash IP=$1 if [ -z $IP ] then echo -e "e[31;42m sh ipcalc.sh IP e[0m" exit fi while read MASK do min=`/usr

C#判断IP格式 获得当前客户端IP

  Visual C# IP相关操作类,获得当前客户端IP,判断IP格式,也就是检测是否是IP地址,一些关于IP的基本操作,欢迎C#新手参考: 01/// 02/// 获得当前页面客户端的IP 03/// 04/// 当前页面客户端的IP 05public static string GetIP() 06{ 07 string result = String.Empty; 08 result = HttpContext.Current.Request.ServerVariables["HTTP_

http代理-浏览器设置了代理ip,为什么跳转到其他网站

问题描述 浏览器设置了代理ip,为什么跳转到其他网站 我刚才用花刺设置了http代理(好像是SOCKS4, SOCKS4A, SOCKS5类型的),我打开百度 为什么会跳转到其他网站呢 解决方案 你要写详细一点,IP和DNS都设了没.你设代理是干什么用的.

ios-tabBar中个人页判断未登录不跳转直接出现登录,登录成功时怎么直接显示个人页面(例淘宝登录)iOS

问题描述 tabBar中个人页判断未登录不跳转直接出现登录,登录成功时怎么直接显示个人页面(例淘宝登录)iOS tabBar中试图控制器:个人页面,跳转前, 判断是未登录,未登录的话,不跳转直接出现登录页面,登录成功时,怎么直接显示个人页面(例淘宝登录)iOS 解决方案 登陆成功后服务器给你返回个状态, self.tabBarController.selectedIndex = 个人的那个页面就可以了.应该可以的 解决方案二: 我们项目中也有这个功能,我们使用的是自定义tabbarcontrol