IP地址和整型互转,常见的自然是用php自带的系统函数ip2long与long2ip
然,ip地址转整型的时候却存在几个问题需要注意:
1.ip的组成字符串中,若是某段出现填充0的情况,结果就会出现错误。代码如下
$ip = '192.168.01.115';
var_dump($ip); echo "<br/>";
$intip = ip2long($ip);
var_dump($intip); echo "<br/>";
$ip = long2ip($intip);
var_dump($ip);
输出结果如下:
string '192.168.01.115' (length=14)
boolean false
string '0.0.0.0' (length=7)
2.ip转整型也会出现有符号的结果,需要注意处理。代码如下
$ip = '192.168.1.115';
var_dump($ip); echo "<br/>";
$intip = ip2long($ip);
var_dump($intip); echo "<br/>";
$ip = long2ip($intip);
var_dump($ip);
输出结果如下:
string '192.168.1.115' (length=13)
int -1062731405
string '192.168.1.115' (length=13)
如此分析,第一步是将ip字符串分解并对每段进行验证和处理,检测ip地址的合法性,重新格式化去除填充零部分;第二步,格式化输出为无符号整型;实现代码如下:
<?php
// 检查IP地址是否合法
function check_ip($ip)
{
$iparr = explode('.',$ip);
foreach($iparr as $v){ if($v>255) return false; }
return true;
}
// IP地址转换无符号整型
function ip2Plus ($ip)
{
$iparr = explode('.',$ip);
// 去除填充零和非数字的值
$result_ip = [];
foreach ($iparr as $val){
if(is_numeric($val)){
$result_ip[] = intval($val);
}
}
$result_ip = implode(".", $result_ip);
if(check_ip($result_ip)){ //检查IP地址是否合法
return sprintf("%u\n",ip2long($result_ip)); //格式化输出无符号整型
}
return false;
}
// 调用方法
$ip = '192.168.01.115';
var_dump($ip); echo "<br/>";
$intip = ip2Plus($ip);
var_dump($intip); echo "<br/>";
$ip = long2ip($intip);
var_dump($ip);
结果如下:
string '192.168.01.115' (length=14)
string '3232235891' (length=11)
string '192.168.1.115' (length=13)
注意:ip地址转无符号整型时,返回值的长度有可能会超出整型的限值,即整数溢出问题。此时,万不可用int()方法转为整型,否则会出错。示例如下:
$ip = '192.168.01.115';
var_dump($ip); echo "<br/>";
$intip = intval(ip2Plus($ip));
var_dump($intip); echo "<br/>";
$ip = long2ip($intip);
var_dump($ip);
结果如下:
string '192.168.01.115' (length=14)
int 2147483647 //此处整数溢出,去整型最大值
string '127.255.255.255' (length=15) //返回的ip地址自然是错的
参考文章:
http://www.jb51.net/article/54012.htm
https://my.oschina.net/goal/blog/198049
http://cn2.php.net/manual/zh/language.types.integer.php
版权声明:本文为u012717614原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。