Home >Backend Development >PHP Problem >How to convert ip address to real address code in php

How to convert ip address to real address code in php

藏色散人
藏色散人Original
2021-10-14 09:28:043546browse

php method to convert ip address to real address: 1. Create PHP sample file; 2. Pass "define('WEB_ROOT',dirname(__FILE__));echo convertip('ip','full' );" method to achieve conversion.

How to convert ip address to real address code in php

The operating environment of this article: windows7 system, PHP7.1 version, DELL G3 computer

php converts the IP address to a real address The method

The method usage example is as follows

define('WEB_ROOT',dirname(__FILE__));
echo convertip('111.63.244.69','full');

func convertip

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 = &#39;- LAN&#39;;
        }elseif($iparray[0]>255||$iparray[1]>255||$iparray[2]>255||$iparray[3]>255){
            $return=&#39;- Invalid IP Address&#39;;
        }else{
            $tinyipfile=WEB_ROOT.&#39;./tinyipdata.dat&#39;;//IP==地址数据包精简版
            $fullipfile=WEB_ROOT.&#39;./wry.dat&#39;;//IP==地址数据包完整版
            if($integrity==&#39;simple&#39;&&@file_exists($tinyipfile)){
                $return=convertip_tiny($ip,$tinyipfile);
            }elseif(@file_exists($fullipfile)){
                $return=convertip_full($ip,$fullipfile);
            }
        }
    }
    return $return;
}

func convertip_tiny

function convertip_tiny($ip,$ipdatafile){
    static $fp=NULL,$offset=array(),$index=NULL;
    $ipdot=explode(&#39;.&#39;,$ip);
    $ip=pack(&#39;N&#39;,ip2long($ip));
    $ipdot[0]=(int)$ipdot[0];
    $ipdot[1]=(int)$ipdot[1];
    if($fp===NULL&&$fp=@fopen($ipdatafile,&#39;rb&#39;)){
        $offset=@unpack(&#39;Nlen&#39;,@fread($fp,4));
        $index=@fread($fp,$offset[&#39;len&#39;]-4);
    }elseif($fp==FALSE){
        return  &#39;- Invalid IP data file&#39;;
    }
    $length=$offset[&#39;len&#39;]-1028;
    $start =@unpack(&#39;Vlen&#39;,$index[$ipdot[0]*4].$index[$ipdot[0]*4+1].$index[$ipdot[0]*4+2].$index[$ipdot[0]*4+3]);
    for ($start=$start[&#39;len&#39;]*8+1024;$start<$length;$start+=8){
        if ($index{$start}.$index{$start+1}.$index{$start+2}.$index{$start+3}>=$ip){
            $index_offset=@unpack(&#39;Vlen&#39;,$index{$start+4}.$index{$start+5}.$index{$start+6}."\x0");
            $index_length=@unpack(&#39;Clen&#39;,$index{$start+7});
            break;
        }
    }
    @fseek($fp,$offset[&#39;len&#39;]+$index_offset[&#39;len&#39;]-1024);
    if($index_length[&#39;len&#39;]){
        return &#39;- &#39;.@fread($fp,$index_length[&#39;len&#39;]);
    }else{
        return &#39;- Unknown&#39;;
    }
}

func convertip_full

function convertip_full($ip,$ipdatafile){
    if(!$fd=@fopen($ipdatafile,&#39;rb&#39;)){
        return &#39;- Invalid IP data file&#39;;
    }
    $ip=explode(&#39;.&#39;,$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(&#39;&#39;,unpack(&#39;L&#39;,$DataBegin));
    if($ipbegin<0) $ipbegin+=pow(2,32);
    @$ipend=implode(&#39;&#39;,unpack(&#39;L&#39;,$DataEnd));
    if($ipend<0) $ipend+=pow(2,32);
    $ipAllNum=($ipend-$ipbegin)/7+1;
    $BeginNum=$ip2num=$ip1num=0;
    $ipAddr1=$ipAddr2=&#39;&#39;;
    $EndNum=$ipAllNum;
    while($ip1num>$ipNum||$ip2num<$ipNum){
        $Middle= intval(($EndNum+$BeginNum)/2);
        fseek($fd,$ipbegin+7*$Middle);
        $ipData1=fread($fd,4);
        if(strlen($ipData1)<4){
        fclose($fd);
            return &#39;- System Error&#39;;
        }
        $ip1num=implode(&#39;&#39;,unpack(&#39;L&#39;,$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 &#39;- System Error&#39;;
        }
        $DataSeek=implode(&#39;&#39;,unpack(&#39;L&#39;,$DataSeek.chr(0)));
        fseek($fd,$DataSeek);
        $ipData2=fread($fd,4);
        if(strlen($ipData2)<4){
            fclose($fd);
            return &#39;- System Error&#39;;
        }
        $ip2num=implode(&#39;&#39;,unpack(&#39;L&#39;,$ipData2));
        if($ip2num<0) $ip2num+=pow(2,32);
        if($ip2num<$ipNum){
            if($Middle==$BeginNum){
                fclose($fd);
                return &#39;- Unknown&#39;;
            }
            $BeginNum=$Middle;
        }
    }
    $ipFlag=fread($fd,1);
    if($ipFlag==chr(1)){
        $ipSeek=fread($fd,3);
        if(strlen($ipSeek)<3){
            fclose($fd);
            return &#39;- System Error&#39;;
        }
        $ipSeek=implode(&#39;&#39;,unpack(&#39;L&#39;,$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 &#39;- System Error&#39;;
        }
        $ipFlag=fread($fd,1);
        if($ipFlag==chr(2)){
            $AddrSeek2=fread($fd,3);
            if(strlen($AddrSeek2)<3){
                fclose($fd);
                return &#39;- System Error&#39;;
            }
            $AddrSeek2=implode(&#39;&#39;,unpack(&#39;L&#39;,$AddrSeek2.chr(0)));
            fseek($fd,$AddrSeek2);
        }else{
            fseek($fd,-1,SEEK_CUR);
        }
        while(($char=fread($fd,1)) != chr(0))
        $ipAddr2 .= $char;
        $AddrSeek=implode(&#39;&#39;,unpack(&#39;L&#39;,$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 &#39;- System Error&#39;;
        }
        $AddrSeek2=implode(&#39;&#39;,unpack(&#39;L&#39;,$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(&#39;/http/i&#39;,$ipAddr2)){
        $ipAddr2=&#39;&#39;;
    }
    $ipaddr="$ipAddr1 $ipAddr2";
    $ipaddr=preg_replace(&#39;/CZ88\.NET/is&#39;,&#39;&#39;,$ipaddr);
    $ipaddr=preg_replace(&#39;/^\s*/is&#39;,&#39;&#39;,$ipaddr);
    $ipaddr=preg_replace(&#39;/\s*$/is&#39;,&#39;&#39;,$ipaddr);
    if(preg_match(&#39;/http/i&#39;,$ipaddr)||$ipaddr==&#39;&#39;){
        $ipaddr=&#39;- Unknown&#39;;
    }
    return &#39;- &#39;.$ipaddr;
}

Recommended learning: "PHP Video Tutorial"

The above is the detailed content of How to convert ip address to real address code in php. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn