视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
php ip如何转数字
2020-11-02 17:28:29 责编:小采
文档


php ip转数字的方法:1、用PHP函数ip2long函数与sprintf函数结合进行转换;2、通过“gmp_strval(gmp_init($ipv6long,2),10);”方法进行转换。

推荐:《PHP视频教程》

PHP中将ip转为数字(ipv4/ipv6)

需求:将ipv4或ivp6的ip地址转为数字后存入数据库中

一、将ipv4转为数字(正整数):

ipv4可直接用PHP自带的函数ip2long()函数与sprintf()函数结合进行转换,代码如下:

$ip = '202.203.44.225';
$ipToInt = sprintf('%u',ip2long($ip)); // 结果为:3402312929
echo "ip '202.203.44.225' to int is: ".$ipToInt;

结果为:

ip2long()函数是将ip转为长整型数字,但有些ip转为长整型数字时是复数,如ip:,所以需要用sprintf()函数将数组转为正整数。也有其他的方法将复数转为正整数,但我觉得sprintf()这个方法最为方便,所以这里建议大家用sprintf()。另外提醒大家,不要用abs()函数进行负数的转换,因为转出来的结果有一定差异,比如:

$ip = '192.168.101.100';
$ip2int = ip2long($ip); 
echo abs($ip2int).'<br/>'; // 结果为:1062705820
echo sprintf('%u',$ip2int); // 结果为:3232261476

二、将ipv6转为数字(正整数):

对于ipv6格式的ip地址,我们无法使用ip2long()函数直接进转换,只能通过其它方式进行转换,下面将贴出网友weissner在PHP手册(http://php.net/manual/zh/function.ip2long.php#94477)留下解决方法,在此之前,需要大家注意的是,需将php.ini文件中,extension=php_gmp.dll之前的注释符号‘;’去掉,因为代码中将用到改扩展中的函数。

将ipv6转为数字的代码如下:

$ipv6 = 'FEDC:BA98:7654:3210:FEDC:BA98:7654:3210';
$ip_n = inet_pton($ipv6);
$bits = 15; // 16 x 8 bit = 128bit
$ipv6long='';
while ($bits >= 0) {
 $bin = sprintf("%08b",(ord($ip_n[$bits])));
 $ipv6long = $bin.$ipv6long;
 $bits--;
}
echo gmp_strval(gmp_init($ipv6long,2),10); // 结果为:338770000845734292534325025077361652240

如大家所见,ipv6的地址转为数字之后,有38个数字,数据库中的bigint也无法存下,所以大家还需要将数据库中的字段类型转为char或varchar类型。

另附代码,判断ip是ivp4还是ipv6,并将ip转为数字格式:

$ip = '192.168.101.100';
//$ip = 'FEDC:BA98:7654:3210:FEDC:BA98:7654:3210';
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
 echo sprintf('%u',ip2long($ip));exit;
 
} else if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6)) {
 
$ip_n = inet_pton($ip);
$bits = 15; // 16 x 8 bit = 128bit
$ipv6long='';
 while ($bits >= 0) {
 $bin = sprintf("%08b",(ord($ip_n[$bits])));
 $ipv6long = $bin.$ipv6long;
 $bits--;
 }
 echo gmp_strval(gmp_init($ipv6long,2),10);exit;
}

下载本文
显示全文
专题