Ip转换为数字,正则匹配ip

来源:互联网 发布:康生书法 知乎 编辑:程序博客网 时间:2024/06/05 02:26

存储空间比较:

varchar 类型 存储 0.0.0.0 -255.255.255.255 是7-15个字节int     类型 存储 是4个字节  1个字节8位  2^31-1  IPv4 实质就是 32位的二进制串   可以用int 存储 

ipv4地址(10进制的4段)转换为32位的2进制。

 1. 先转换为2进制,然后连在一起 2. 左移 3*8 2*8 1*8 0 位 

转换:

转换方式 php 内置函数 Mysql 内置函数 字符串转int php long2ip(118.190.3.21) mysql INET_NTOA(str_to_int) int转字符串 php ip2long(3031005402) mysql INET_ATON(int_to_str)
function ipton($ip){    $ip_arr=explode('.',$ip);//分隔ip段    foreach ($ip_arr as $value)    {        $iphex=dechex($value);//将每段ip转换成16进制        if(strlen($iphex)<2)//255的16进制表示是ff,所以每段ip的16进制长度不会超过2        {            $iphex='0'.$iphex;//如果转换后的16进制数长度小于2,在其前面加一个0        //没有长度为2,且第一位是0的16进制表示,这是为了在将数字转换成ip时,好处理        }        $ipstr.=$iphex;//将四段IP的16进制数连接起来,得到一个16进制字符串,长度为8    }    return hexdec($ipstr);//将16进制字符串转换成10进制,得到ip的数字表示}//将数字转换为IP,进行上面函数的逆向过程function ntoip($n){    $iphex=dechex($n);//将10进制数字转换成16进制    $len=strlen($iphex);//得到16进制字符串的长度    if(strlen($iphex)<8)    {        $iphex='0'.$iphex;//如果长度小于8,在最前面加0        $len=strlen($iphex); //重新得到16进制字符串的长度    }    //这是因为ipton函数得到的16进制字符串,如果第一位为0,在转换成数字后,是不会显示的    //所以,如果长度小于8,肯定要把第一位的0加上去    //为什么一定是第一位的0呢,因为在ipton函数中,后面各段加的'0'都在中间,转换成数字后,不会消失    for($i=0,$j=0;$j<$len;$i=$i+1,$j=$j+2)    {//循环截取16进制字符串,每次截取2个长度        $ippart=substr($iphex,$j,2);//得到每段IP所对应的16进制数        $fipart=substr($ippart,0,1);//截取16进制数的第一位        if($fipart=='0')        {//如果第一位为0,说明原数只有1位            $ippart=substr($ippart,1,1);//将0截取掉        }        $ip[]=hexdec($ippart);//将每段16进制数转换成对应的10进制数,即IP各段的值    }    $ip = array_reverse($ip);    return implode('.', $ip);//连接各段,返回原IP值}

转换原理:

1. 字符串转int     dechex    分段之后 每段 max 最大换算成16进制 是 ff 所以不会超过2  做长度判断 如果小于2补0,拼起来 得到长度为8的16进制数, hexdec 将16转换为10进制 2. int转字符串     逆过程

正则匹配:

 functionis_ip($gonten){   $gonten = '255.190.3.21';$ip=explode('.',$gonten);for($i=0;$i<count($ip);$i++){    if($ip[$i]>255){        return(0);    }}preg_match("/^(((1?\d{1,2})|(2[0-4]\d)|(25[0-5]))\.){3}((1?\d{1,2})|(2[0-4]\d)|(25[0-5]))$/",$gonten) ;var_dump($gonten);
原创粉丝点击