当前位置:Gxlcms > PHP教程 > php将IP地址转换为真实地址的方法

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

时间:2021-07-01 10:21:17 帮助过:46人阅读

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

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

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

  1. <p>define('WEB_ROOT',dirname(__FILE__));</p><p>echo convertip('112.65.242.67','full');</p>

注意:

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

人气教程排行