php将IP地址转换为真实地址的方法
程序员文章站
2022-04-26 11:59:03
...
下面将分享一个利用PHP将获取到的IP地址转换为真实实际地址的方法。代码函数摘自大名鼎鼎的康盛的Discuz源码,可以根据实际需要返回简短地址和详细地址两种形式。
function convertip($ip,$integrity='simple'){
$return='';
$integrity=in_array($integrity,array('simple','full'))?$integrity:'simple';
if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/",$ip)){
$iparray=explode('.',$ip);
if($iparray[0]==10||$iparray[0]==127||($iparray[0]==192&&$iparray[1]==168)||($iparray[0]==172&&($iparray[1]>=16&&$iparray[1] $return='- LAN';
}elseif($iparray[0]>255||$iparray[1]>255||$iparray[2]>255||$iparray[3]>255){
$return='- Invalid IP Address';
}else{
$tinyipfile=WEB_ROOT.'./tinyipdata.dat';//IP==地址数据包精简版
$fullipfile=WEB_ROOT.'./wry.dat';//IP==地址数据包完整版
if($integrity=='simple'&&@file_exists($tinyipfile)){
$return=convertip_tiny($ip,$tinyipfile);
}elseif(@file_exists($fullipfile)){
$return=convertip_full($ip,$fullipfile);
}
}
}
return $return;
}
function convertip_tiny($ip,$ipdatafile){
static $fp=NULL,$offset=array(),$index=NULL;
$ipdot=explode('.',$ip);
$ip=pack('N',ip2long($ip));
$ipdot[0]=(int)$ipdot[0];
$ipdot[1]=(int)$ipdot[1];
if($fp===NULL&&$fp=@fopen($ipdatafile,'rb')){
$offset=@unpack('Nlen',@fread($fp,4));
$index=@fread($fp,$offset['len']-4);
}elseif($fp==FALSE){
return '- Invalid IP data file';
}
$length=$offset['len']-1028;
$start =@unpack('Vlen',$index[$ipdot[0]*4].$index[$ipdot[0]*4+1].$index[$ipdot[0]*4+2].$index[$ipdot[0]*4+3]);
for ($start=$start['len']*8+1024;$start if ($index{$start}.$index{$start+1}.$index{$start+2}.$index{$start+3}>=$ip){
$index_offset=@unpack('Vlen',$index{$start+4}.$index{$start+5}.$index{$start+6}."\x0");
$index_length=@unpack('Clen',$index{$start+7});
break;
}
}
@fseek($fp,$offset['len']+$index_offset['len']-1024);
if($index_length['len']){
return '- '.@fread($fp,$index_length['len']);
}else{
return '- Unknown';
}
}
function convertip_full($ip,$ipdatafile){
if(!$fd=@fopen($ipdatafile,'rb')){
return '- Invalid IP data file';
}
$ip=explode('.',$ip);
$ipNum=$ip[0]*16777216+$ip[1]*65536+$ip[2]*256+$ip[3];
if(!($DataBegin=fread($fd,4))||!($DataEnd=fread($fd,4))) return;
@$ipbegin=implode('',unpack('L',$DataBegin));
if($ipbegin @$ipend=implode('',unpack('L',$DataEnd));
if($ipend $ipAllNum=($ipend-$ipbegin)/7+1;
$BeginNum=$ip2num=$ip1num=0;
$ipAddr1=$ipAddr2='';
$EndNum=$ipAllNum;
while($ip1num>$ipNum||$ip2num $Middle= intval(($EndNum+$BeginNum)/2);
fseek($fd,$ipbegin+7*$Middle);
$ipData1=fread($fd,4);
if(strlen($ipData1) fclose($fd);
return '- System Error';
}
$ip1num=implode('',unpack('L',$ipData1));
if($ip1num if($ip1num>$ipNum){
$EndNum=$Middle;
continue;
}
$DataSeek=fread($fd,3);
if(strlen($DataSeek) fclose($fd);
return '- System Error';
}
$DataSeek=implode('',unpack('L',$DataSeek.chr(0)));
fseek($fd,$DataSeek);
$ipData2=fread($fd,4);
if(strlen($ipData2) fclose($fd);
return '- System Error';
}
$ip2num=implode('',unpack('L',$ipData2));
if($ip2num if($ip2num if($Middle==$BeginNum){
fclose($fd);
return '- Unknown';
}
$BeginNum=$Middle;
}
}
$ipFlag=fread($fd,1);
if($ipFlag==chr(1)){
$ipSeek=fread($fd,3);
if(strlen($ipSeek) fclose($fd);
return '- System Error';
}
$ipSeek=implode('',unpack('L',$ipSeek.chr(0)));
fseek($fd,$ipSeek);
$ipFlag=fread($fd,1);
}
if($ipFlag==chr(2)){
$AddrSeek=fread($fd,3);
if(strlen($AddrSeek) fclose($fd);
return '- System Error';
}
$ipFlag=fread($fd,1);
if($ipFlag==chr(2)){
$AddrSeek2=fread($fd,3);
if(strlen($AddrSeek2) fclose($fd);
return '- System Error';
}
$AddrSeek2=implode('',unpack('L',$AddrSeek2.chr(0)));
fseek($fd,$AddrSeek2);
}else{
fseek($fd,-1,SEEK_CUR);
}
while(($char=fread($fd,1)) != chr(0))
$ipAddr2 .= $char;
$AddrSeek=implode('',unpack('L',$AddrSeek.chr(0)));
fseek($fd,$AddrSeek);
while(($char=fread($fd,1)) != chr(0))
$ipAddr1 .= $char;
}else{
fseek($fd,-1,SEEK_CUR);
while(($char=fread($fd,1)) != chr(0))
$ipAddr1 .= $char;
$ipFlag=fread($fd,1);
if($ipFlag==chr(2)){
$AddrSeek2=fread($fd,3);
if(strlen($AddrSeek2) fclose($fd);
return '- System Error';
}
$AddrSeek2=implode('',unpack('L',$AddrSeek2.chr(0)));
fseek($fd,$AddrSeek2);
}else{
fseek($fd,-1,SEEK_CUR);
}
while(($char=fread($fd,1)) != chr(0))
$ipAddr2 .= $char;
}
fclose($fd);
if(preg_match('/http/i',$ipAddr2)){
$ipAddr2='';
}
$ipaddr="$ipAddr1 $ipAddr2";
$ipaddr=preg_replace('/CZ88\.NET/is','',$ipaddr);
$ipaddr=preg_replace('/^\s*/is','',$ipaddr);
$ipaddr=preg_replace('/\s*$/is','',$ipaddr);
if(preg_match('/http/i',$ipaddr)||$ipaddr==''){
$ipaddr='- Unknown';
}
return '- '.$ipaddr;}
以上代码使用方法示例如下:
define('WEB_ROOT',dirname(__FILE__));
echo convertip('112.65.242.67','full');
注意:
wry.dat请到www.cz88.net下载!