欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  后端开发

php将IP地址转换为真实地址的方法

程序员文章站 2022-06-14 20:56:18
...
下面将分享一个利用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下载!