分享一个利用PHP将获取到的IP地址转换为真实实际地址的方法

下面将分享一个利用PHP将获取到的IP地址转换为真实实际地址的方法。代码函数摘自大名鼎鼎的康盛的Discuz源码,可以根据实际需要返回简短地址和详细地址两种形式。

  1. function convertip($ip,$integrity='simple'){ 
  2.     $return=''
  3.     $integrity=in_array($integrity,array('simple','full'))?$integrity:'simple'
  4.     if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/",$ip)){ 
  5.         $iparray=explode('.',$ip); 
  6.         if($iparray[0]==10||$iparray[0]==127||($iparray[0]==192&&$iparray[1]==168)||($iparray[0]==172&&($iparray[1]>=16&&$iparray[1]<=31))){ 
  7.             $return='- LAN'
  8.         }elseif($iparray[0]>255||$iparray[1]>255||$iparray[2]>255||$iparray[3]>255){ 
  9.             $return='- Invalid IP Address'
  10.         }else
  11.             $tinyipfile=WEB_ROOT.'./tinyipdata.dat';//IP==地址数据包精简版 
  12.             $fullipfile=WEB_ROOT.'./wry.dat';//IP==地址数据包完整版 
  13.             if($integrity=='simple'&&@file_exists($tinyipfile)){ 
  14.                 $return=convertip_tiny($ip,$tinyipfile); 
  15.             }elseif(@file_exists($fullipfile)){ 
  16.                 $return=convertip_full($ip,$fullipfile); 
  17.             } 
  18.         } 
  19.     } 
  20.     return $return
  21. function convertip_tiny($ip,$ipdatafile){ 
  22.     static $fp=NULL,$offset=array(),$index=NULL; 
  23.     $ipdot=explode('.',$ip); 
  24.     $ip=pack('N',ip2long($ip)); 
  25.     $ipdot[0]=(int)$ipdot[0]; 
  26.     $ipdot[1]=(int)$ipdot[1]; 
  27.     if($fp===NULL&&$fp=@fopen($ipdatafile,'rb')){ 
  28.         $offset=@unpack('Nlen',@fread($fp,4)); 
  29.         $index=@fread($fp,$offset['len']-4); 
  30.     }elseif($fp==FALSE){ 
  31.         return  '- Invalid IP data file'
  32.     } 
  33.     $length=$offset['len']-1028; 
  34.     $start =@unpack('Vlen',$index[$ipdot[0]*4].$index[$ipdot[0]*4+1].$index[$ipdot[0]*4+2].$index[$ipdot[0]*4+3]); 
  35.     for ($start=$start['len']*8+1024;$start<$length;$start+=8){ 
  36.         if ($index{$start}.$index{$start+1}.$index{$start+2}.$index{$start+3}>=$ip){ 
  37.             $index_offset=@unpack('Vlen',$index{$start+4}.$index{$start+5}.$index{$start+6}."\x0"); 
  38.             $index_length=@unpack('Clen',$index{$start+7}); 
  39.             break
  40.         } 
  41.     } 
  42.     @fseek($fp,$offset['len']+$index_offset['len']-1024); 
  43.     if($index_length['len']){ 
  44.         return '- '.@fread($fp,$index_length['len']); 
  45.     }else
  46.         return '- Unknown'
  47.     } 
  48. function convertip_full($ip,$ipdatafile){ 
  49.     if(!$fd=@fopen($ipdatafile,'rb')){ 
  50.         return '- Invalid IP data file'
  51.     } 
  52.     $ip=explode('.',$ip); 
  53.     $ipNum=$ip[0]*16777216+$ip[1]*65536+$ip[2]*256+$ip[3]; 
  54.     if(!($DataBegin=fread($fd,4))||!($DataEnd=fread($fd,4))) return
  55.     @$ipbegin=implode('',unpack('L',$DataBegin)); 
  56.     if($ipbegin<0) $ipbegin+=pow(2,32); 
  57.     @$ipend=implode('',unpack('L',$DataEnd)); 
  58.     if($ipend<0) $ipend+=pow(2,32); 
  59.     $ipAllNum=($ipend-$ipbegin)/7+1; 
  60.     $BeginNum=$ip2num=$ip1num=0; 
  61.     $ipAddr1=$ipAddr2=''
  62.     $EndNum=$ipAllNum
  63.     while($ip1num>$ipNum||$ip2num<$ipNum){ 
  64.         $Middleintval(($EndNum+$BeginNum)/2); 
  65.         fseek($fd,$ipbegin+7*$Middle); 
  66.         $ipData1=fread($fd,4); 
  67.         if(strlen($ipData1)<4){ 
  68.             fclose($fd); 
  69.             return '- System Error'
  70.         } 
  71.         $ip1num=implode('',unpack('L',$ipData1)); 
  72.         if($ip1num<0) $ip1num+=pow(2,32); 
  73.         if($ip1num>$ipNum){ 
  74.             $EndNum=$Middle
  75.             continue
  76.         } 
  77.         $DataSeek=fread($fd,3); 
  78.         if(strlen($DataSeek)<3){ 
  79.             fclose($fd); 
  80.             return '- System Error'
  81.         } 
  82.         $DataSeek=implode('',unpack('L',$DataSeek.chr(0))); 
  83.         fseek($fd,$DataSeek); 
  84.         $ipData2=fread($fd,4); 
  85.         if(strlen($ipData2)<4){ 
  86.             fclose($fd); 
  87.             return '- System Error'
  88.         } 
  89.         $ip2num=implode('',unpack('L',$ipData2)); 
  90.         if($ip2num<0) $ip2num+=pow(2,32); 
  91.         if($ip2num<$ipNum){ 
  92.             if($Middle==$BeginNum){ 
  93.                 fclose($fd); 
  94.                 return '- Unknown'
  95.             } 
  96.             $BeginNum=$Middle
  97.         } 
  98.     } 
  99.     $ipFlag=fread($fd,1); 
  100.     if($ipFlag==chr(1)){ 
  101.         $ipSeek=fread($fd,3); 
  102.         if(strlen($ipSeek)<3){ 
  103.             fclose($fd); 
  104.             return '- System Error'
  105.         } 
  106.         $ipSeek=implode('',unpack('L',$ipSeek.chr(0))); 
  107.         fseek($fd,$ipSeek); 
  108.         $ipFlag=fread($fd,1); 
  109.     } 
  110.     if($ipFlag==chr(2)){ 
  111.         $AddrSeek=fread($fd,3); 
  112.         if(strlen($AddrSeek)<3){ 
  113.             fclose($fd); 
  114.             return '- System Error'
  115.         } 
  116.         $ipFlag=fread($fd,1); 
  117.         if($ipFlag==chr(2)){ 
  118.             $AddrSeek2=fread($fd,3); 
  119.             if(strlen($AddrSeek2)<3){ 
  120.                 fclose($fd); 
  121.                 return '- System Error'
  122.             } 
  123.             $AddrSeek2=implode('',unpack('L',$AddrSeek2.chr(0))); 
  124.             fseek($fd,$AddrSeek2); 
  125.         }else
  126.             fseek($fd,-1,SEEK_CUR); 
  127.         } 
  128.         while(($char=fread($fd,1)) != chr(0)) 
  129.         $ipAddr2 .= $char
  130.         $AddrSeek=implode('',unpack('L',$AddrSeek.chr(0))); 
  131.         fseek($fd,$AddrSeek); 
  132.         while(($char=fread($fd,1)) != chr(0)) 
  133.         $ipAddr1 .= $char
  134.     }else
  135.         fseek($fd,-1,SEEK_CUR); 
  136.         while(($char=fread($fd,1)) != chr(0)) 
  137.         $ipAddr1 .= $char
  138.         $ipFlag=fread($fd,1); 
  139.         if($ipFlag==chr(2)){ 
  140.             $AddrSeek2=fread($fd,3); 
  141.             if(strlen($AddrSeek2)<3){ 
  142.                 fclose($fd); 
  143.                 return '- System Error'
  144.             } 
  145.             $AddrSeek2=implode('',unpack('L',$AddrSeek2.chr(0))); 
  146.             fseek($fd,$AddrSeek2); 
  147.         }else
  148.             fseek($fd,-1,SEEK_CUR); 
  149.         } 
  150.         while(($char=fread($fd,1)) != chr(0)) 
  151.         $ipAddr2 .= $char
  152.     } 
  153.     fclose($fd); 
  154.     if(preg_match('/http/i',$ipAddr2)){ 
  155.         $ipAddr2=''
  156.     } 
  157.     $ipaddr="$ipAddr1 $ipAddr2"
  158.     $ipaddr=preg_replace('/CZ88\.NET/is','',$ipaddr); 
  159.     $ipaddr=preg_replace('/^\s*/is','',$ipaddr); 
  160.     $ipaddr=preg_replace('/\s*$/is','',$ipaddr); 
  161.     if(preg_match('/http/i',$ipaddr)||$ipaddr==''){ 
  162.         $ipaddr='- Unknown'
  163.     } 
  164.     return '- '.$ipaddr

以上代码使用方法示例如下:

  1. define('WEB_ROOT',dirname(__FILE__)); 
  2. echo convertip('112.65.242.67','full'); 

转载请注明:代码家园 » 分享一个利用PHP将获取到的IP地址转换为真实实际地址的方法

评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)