php 根据ip显示地区代码
func = 'data_mini';
$this->fp = @fopen(ipdata_mini, 'rb');
$this->offset = unpack('nlen', fread($this->fp, 4));
$this->index = fread($this->fp, $this->offset['len'] - 4);
}
elseif(@file_exists(ipdata_full))
{
$this->func = 'data_full';
$this->fp = @fopen(ipdata_full, 'rb');
}
}
function get($ip)
{
$return = '';
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
{
$return = $this->func ? $this->{$this->func}($ip) : '';
if(strpos($return, ' ') !== false) $return = substr($return, 0, strpos($return,' '));
}
if(strtolower(charset) == 'utf-8') $return = iconv('gbk', 'utf-8', $return);
}
return $return;
}
function data_mini($ip)
{
$ipdot = explode('.', $ip);
$ipdot[0] = (int)$ipdot[0];
$ipdot[1] = (int)$ipdot[1];
$ip = pack('n', ip2long($ip));
$length = $this->offset['len'] - 1028;
$start = unpack('vlen', $this->index[$ipdot[0] * 4] . $this->index[$ipdot[0] * 4 + 1] . $this->index[$ipdot[0] * 4 + 2] . $this->index[$ipdot[0] * 4 + 3]);
for($start = $start['len'] * 8 + 1024; $start {
if($this->index{$start} . $this->index{$start + 1} . $this->index{$start + 2} . $this->index{$start + 3} >= $ip)
{
$this->index_offset = unpack('vlen', $this->index{$start + 4} . $this->index{$start + 5} . $this->index{$start + 6} . x0);
$this->index_length = unpack('clen', $this->index{$start + 7});
break;
}
}
fseek($this->fp, $this->offset['len'] + $this->index_offset['len'] - 1024);
if($this->index_length['len'])
{
return str_replace('- ', '', fread($this->fp, $this->index_length['len']));
}
else
{
return 'unknown';
}
}
function data_full($ip)
{
rewind($this->fp);
$ip = explode('.', $ip);
$ipnum = $ip[0] * 16777216 + $ip[1] * 65536 + $ip[2] * 256 + $ip[3];
if(!($databegin = fread($this->fp, 4)) || !($dataend = fread($this->fp, 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($this->fp, $ipbegin + 7 * $middle);
$ipdata1 = fread($this->fp, 4);
if(strlen($ipdata1) {
fclose($this->fp);
return 'system error';
}
$ip1num = implode('', unpack('l', $ipdata1));
if($ip1num if($ip1num > $ipnum)
{
$endnum = $middle;
continue;
}
$dataseek = fread($this->fp, 3);
if(strlen($dataseek) {
fclose($this->fp);
return 'system error';
}
$dataseek = implode('', unpack('l', $dataseek.chr(0)));
fseek($this->fp, $dataseek);
$ipdata2 = fread($this->fp, 4);
if(strlen($ipdata2) {
fclose($this->fp);
return 'system error';
}
$ip2num = implode('', unpack('l', $ipdata2));
if($ip2num if($ip2num {
if($middle == $beginnum)
{
fclose($this->fp);
return 'unknown';
}
$beginnum = $middle;
}
}
$ipflag = fread($this->fp, 1);
if($ipflag == chr(1))
{
$ipseek = fread($this->fp, 3);
if(strlen($ipseek) {
fclose($this->fp);
return 'system error';
}
$ipseek = implode('', unpack('l', $ipseek.chr(0)));
fseek($this->fp, $ipseek);
$ipflag = fread($this->fp, 1);
}
if($ipflag == chr(2))
{
$addrseek = fread($this->fp, 3);
if(strlen($addrseek) {
fclose($this->fp);
return 'system error';
}
$ipflag = fread($this->fp, 1);
if($ipflag == chr(2)) {
$addrseek2 = fread($this->fp, 3);
if(strlen($addrseek2) {
fclose($this->fp);
return 'system error';
}
$addrseek2 = implode('', unpack('l', $addrseek2.chr(0)));
fseek($this->fp, $addrseek2);
}
else
{
fseek($this->fp, -1, seek_cur);
}
while(($char = fread($this->fp, 1)) != chr(0))
$ipaddr2 .= $char;
$addrseek = implode('', unpack('l', $addrseek.chr(0)));
fseek($this->fp, $addrseek);
while(($char = fread($this->fp, 1)) != chr(0))
$ipaddr1 .= $char;
}
else
{
fseek($this->fp, -1, seek_cur);
while(($char = fread($this->fp, 1)) != chr(0))
$ipaddr1 .= $char;
$ipflag = fread($this->fp, 1);
if($ipflag == chr(2))
{
$addrseek2 = fread($this->fp, 3);
if(strlen($addrseek2) {
fclose($this->fp);
return 'system error';
}
$addrseek2 = implode('', unpack('l', $addrseek2.chr(0)));
fseek($this->fp, $addrseek2);
}
else
{
fseek($this->fp, -1, seek_cur);
}
while(($char = fread($this->fp, 1)) != chr(0))
$ipaddr2 .= $char;
}
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;
}
function close()
{
@fclose($this->fp);
}
}
?>
