Heim > Backend-Entwicklung > PHP-Tutorial > php将IP地址转换为真实地址的方法

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

WBOY
Freigeben: 2016-06-20 13:05:04
Original
2330 Leute haben es durchsucht

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

<p>function convertip($ip,$integrity='simple'){</p>	$return='';<br />	$integrity=in_array($integrity,array('simple','full'))?$integrity:'simple';<br />	if(preg_match("/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/",$ip)){<br />		$iparray=explode('.',$ip);<br />		if($iparray[0]==10||$iparray[0]==127||($iparray[0]==192&&$iparray[1]==168)||($iparray[0]==172&&($iparray[1]>=16&&$iparray[1]<=31))){<br />			$return='- LAN';<br />		}elseif($iparray[0]>255||$iparray[1]>255||$iparray[2]>255||$iparray[3]>255){<br />			$return='- Invalid IP Address';<br />		}else{<br />			$tinyipfile=WEB_ROOT.'./tinyipdata.dat';//IP==地址数据包精简版<br />			$fullipfile=WEB_ROOT.'./wry.dat';//IP==地址数据包完整版<br />			if($integrity=='simple'&&@file_exists($tinyipfile)){<br />				$return=convertip_tiny($ip,$tinyipfile);<br />			}elseif(@file_exists($fullipfile)){<br />				$return=convertip_full($ip,$fullipfile);<br />			}<br />		}<br />	}<br />	return $return;<br />}<br />function convertip_tiny($ip,$ipdatafile){<br />	static $fp=NULL,$offset=array(),$index=NULL;<br />	$ipdot=explode('.',$ip);<br />	$ip=pack('N',ip2long($ip));<br />	$ipdot[0]=(int)$ipdot[0];<br />	$ipdot[1]=(int)$ipdot[1];<br />	if($fp===NULL&&$fp=@fopen($ipdatafile,'rb')){<br />		$offset=@unpack('Nlen',@fread($fp,4));<br />		$index=@fread($fp,$offset['len']-4);<br />	}elseif($fp==FALSE){<br />		return  '- Invalid IP data file';<br />	}<br />	$length=$offset['len']-1028;<br />	$start =@unpack('Vlen',$index[$ipdot[0]*4].$index[$ipdot[0]*4+1].$index[$ipdot[0]*4+2].$index[$ipdot[0]*4+3]);<br />	for ($start=$start['len']*8+1024;$start<$length;$start+=8){<br />		if ($index{$start}.$index{$start+1}.$index{$start+2}.$index{$start+3}>=$ip){<br />			$index_offset=@unpack('Vlen',$index{$start+4}.$index{$start+5}.$index{$start+6}."\x0");<br />			$index_length=@unpack('Clen',$index{$start+7});<br />			break;<br />		}<br />	}<br />	@fseek($fp,$offset['len']+$index_offset['len']-1024);<br />	if($index_length['len']){<br />		return '- '.@fread($fp,$index_length['len']);<br />	}else{<br />		return '- Unknown';<br />	}<br />}<br />function convertip_full($ip,$ipdatafile){<br />	if(!$fd=@fopen($ipdatafile,'rb')){<br />		return '- Invalid IP data file';<br />	}<br />	$ip=explode('.',$ip);<br />	$ipNum=$ip[0]*16777216+$ip[1]*65536+$ip[2]*256+$ip[3];<br />	if(!($DataBegin=fread($fd,4))||!($DataEnd=fread($fd,4))) return;<br />	@$ipbegin=implode('',unpack('L',$DataBegin));<br />	if($ipbegin<0) $ipbegin+=pow(2,32);<br />	@$ipend=implode('',unpack('L',$DataEnd));<br />	if($ipend<0) $ipend+=pow(2,32);<br />	$ipAllNum=($ipend-$ipbegin)/7+1;<br />	$BeginNum=$ip2num=$ip1num=0;<br />	$ipAddr1=$ipAddr2='';<br />	$EndNum=$ipAllNum;<br />	while($ip1num>$ipNum||$ip2num<$ipNum){<br />		$Middle= intval(($EndNum+$BeginNum)/2);<br />		fseek($fd,$ipbegin+7*$Middle);<br />		$ipData1=fread($fd,4);<br />		if(strlen($ipData1)<4){<br />			fclose($fd);<br />			return '- System Error';<br />		}<br />		$ip1num=implode('',unpack('L',$ipData1));<br />		if($ip1num<0) $ip1num+=pow(2,32);<br />		if($ip1num>$ipNum){<br />			$EndNum=$Middle;<br />			continue;<br />		}<br />		$DataSeek=fread($fd,3);<br />		if(strlen($DataSeek)<3){<br />			fclose($fd);<br />			return '- System Error';<br />		}<br />		$DataSeek=implode('',unpack('L',$DataSeek.chr(0)));<br />		fseek($fd,$DataSeek);<br />		$ipData2=fread($fd,4);<br />		if(strlen($ipData2)<4){<br />			fclose($fd);<br />			return '- System Error';<br />		}<br />		$ip2num=implode('',unpack('L',$ipData2));<br />		if($ip2num<0) $ip2num+=pow(2,32);<br />		if($ip2num<$ipNum){<br />			if($Middle==$BeginNum){<br />				fclose($fd);<br />				return '- Unknown';<br />			}<br />			$BeginNum=$Middle;<br />		}<br />	}<br />	$ipFlag=fread($fd,1);<br />	if($ipFlag==chr(1)){<br />		$ipSeek=fread($fd,3);<br />		if(strlen($ipSeek)<3){<br />			fclose($fd);<br />			return '- System Error';<br />		}<br />		$ipSeek=implode('',unpack('L',$ipSeek.chr(0)));<br />		fseek($fd,$ipSeek);<br />		$ipFlag=fread($fd,1);<br />	}<br />	if($ipFlag==chr(2)){<br />		$AddrSeek=fread($fd,3);<br />		if(strlen($AddrSeek)<3){<br />			fclose($fd);<br />			return '- System Error';<br />		}<br />		$ipFlag=fread($fd,1);<br />		if($ipFlag==chr(2)){<br />			$AddrSeek2=fread($fd,3);<br />			if(strlen($AddrSeek2)<3){<br />				fclose($fd);<br />				return '- System Error';<br />			}<br />			$AddrSeek2=implode('',unpack('L',$AddrSeek2.chr(0)));<br />			fseek($fd,$AddrSeek2);<br />		}else{<br />			fseek($fd,-1,SEEK_CUR);<br />		}<br />		while(($char=fread($fd,1)) != chr(0))<br />		$ipAddr2 .= $char;<br />		$AddrSeek=implode('',unpack('L',$AddrSeek.chr(0)));<br />		fseek($fd,$AddrSeek);<br />		while(($char=fread($fd,1)) != chr(0))<br />		$ipAddr1 .= $char;<br />	}else{<br />		fseek($fd,-1,SEEK_CUR);<br />		while(($char=fread($fd,1)) != chr(0))<br />		$ipAddr1 .= $char;<br />		$ipFlag=fread($fd,1);<br />		if($ipFlag==chr(2)){<br />			$AddrSeek2=fread($fd,3);<br />			if(strlen($AddrSeek2)<3){<br />				fclose($fd);<br />				return '- System Error';<br />			}<br />			$AddrSeek2=implode('',unpack('L',$AddrSeek2.chr(0)));<br />			fseek($fd,$AddrSeek2);<br />		}else{<br />			fseek($fd,-1,SEEK_CUR);<br />		}<br />		while(($char=fread($fd,1)) != chr(0))<br />		$ipAddr2 .= $char;<br />	}<br />	fclose($fd);<br />	if(preg_match('/http/i',$ipAddr2)){<br />		$ipAddr2='';<br />	}<br />	$ipaddr="$ipAddr1 $ipAddr2";<br />	$ipaddr=preg_replace('/CZ88\.NET/is','',$ipaddr);<br />	$ipaddr=preg_replace('/^\s*/is','',$ipaddr);<br />	$ipaddr=preg_replace('/\s*$/is','',$ipaddr);<br />	if(preg_match('/http/i',$ipaddr)||$ipaddr==''){<br />		$ipaddr='- Unknown';<br />	}<br />	return '- '.$ipaddr;<br /><p>}
Nach dem Login kopieren

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

<p>define('WEB_ROOT',dirname(__FILE__));</p><p>echo convertip('112.65.242.67','full');
Nach dem Login kopieren

注意:

wry.dat请到www.cz88.net下载!


Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage