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

下面将分享一个利用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]<=31))){

$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;$startif ($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<0) $ipbegin+=pow(2,32);

@$ipend=implode('',unpack('L',$DataEnd));

if($ipend<0) $ipend+=pow(2,32);

$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)<4){

fclose($fd);

return '- System Error';

}

$ip1num=implode('',unpack('L',$ipData1));

if($ip1num<0) $ip1num+=pow(2,32);

if($ip1num>$ipNum){

$EndNum=$Middle;

continue;

}

$DataSeek=fread($fd,3);

if(strlen($DataSeek)<3){

fclose($fd);

return '- System Error';

}

$DataSeek=implode('',unpack('L',$DataSeek.chr(0)));

fseek($fd,$DataSeek);

$ipData2=fread($fd,4);

if(strlen($ipData2)<4){

fclose($fd);

return '- System Error';

}

$ip2num=implode('',unpack('L',$ipData2));

if($ip2num<0) $ip2num+=pow(2,32);

if($ip2numif($Middle==$BeginNum){

fclose($fd);

return '- Unknown';

}

$BeginNum=$Middle;

}

}

$ipFlag=fread($fd,1);

if($ipFlag==chr(1)){

$ipSeek=fread($fd,3);

if(strlen($ipSeek)<3){

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)<3){

fclose($fd);

return '- System Error';

}

$ipFlag=fread($fd,1);

if($ipFlag==chr(2)){

$AddrSeek2=fread($fd,3);

if(strlen($AddrSeek2)<3){

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)<3){

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下载!

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值