找回密码
 注册

PHP IPv4 转 IPv6 函数

php 发表于 2019/6/23 22:59 | 显示全部楼层 |阅读模式
PHP 将 IPv4 转为 IPv6,使用PHP自定义函数实现。

IPv4 地址可以使用 IPv6 表示,以 IPv4 地址 10.10.10.10 为例,转成完整的 IPv6 地址为 0:0:0:0:0:ffff:0a0a:0a0a,压缩连续的0段简写为 ::ffff:0a0a:0a0a,还可以进一步删除每一段的前导0简写为 ::ffff:a0a:a0a

以下代码通过 PHP 将 IPv4 地址转换为 IPv6地址,得到的最终结果为完整的 IPv6 地址,返回完整的 IPv6 地址,是因为目前部分域名解析服务提供商不支持 ::开头的 IPv6 地址。如果需要压缩连续0段或者删除每段中的前导0,需要自行完善该函数代码。

以下代码只是PHP IPv4转IPv6方法之一,还可以通过 ip2long() 函数将 IPv4 地址转为十进制整数,再将十进制整数转换为十六进制数来实现。

IPv6 也支持直接将 IPv4 地址放在 0:0:0:0:0:ffff: 前缀后面,IPv4 地址 10.10.10.10 可以写成 0:0:0:0:0:ffff:10.10.10.10,或者简写为::ffff:10.10.10.10对于 127.0.0.1 这种以 127 开头的本机环回IP地址,以上规则同样适用,也可以直接使用IPv6的环回地址 ::1,::1 并不是 127.0.0.1 IPv6化的结果,但作用相同。

对于 0.0.0.0 这个特殊 IPv4 地址,以上规则同样适用,转换为 IPv6 后简写为 ::
  1. <?php
  2.         /*
  3.          * PHP IPv4 转 IPv6
  4.          * @author 吴先成 wuxiancheng.cn 51-n.com
  5.          * @param string $IPv4Address 需要转为 IPv6 的 IPv4 地址
  6.          * @return string | false 传入有效的 IPv4 地址时返回转换后的 IPv6 地址,否则返回false
  7.         */
  8.         function IPv4ToIPv6($IPv4Address){
  9.                 if(!is_string($IPv4Address)){
  10.                         return false;
  11.                 }
  12.                 if(preg_match('%^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$%', $IPv4Address, $match)){
  13.                         $IPParts = array();
  14.                         for($i=1; $i<=4; $i++){
  15.                                 $IPPart = (int)$match[$i];
  16.                                 if($IPPart > 255){
  17.                                         return false;
  18.                                 }
  19.                                 $IPParts[$i] = str_pad(decHex($IPPart), 2, '0', STR_PAD_LEFT);
  20.                         }
  21.                         $IPv6Address = '0:0:0:0:0:ffff:' . $IPParts[1] . $IPParts[2] . ':' . $IPParts[3] . $IPParts[4];
  22.                         return $IPv6Address;
  23.                 }
  24.                 return false;
  25.         }
复制代码

手机版|轻松E站

轻松E站

快速回复 返回顶部 返回列表