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 后简写为 ::
- <?php
- /*
- * PHP IPv4 转 IPv6
- * @author 吴先成 wuxiancheng.cn 51-n.com
- * @param string $IPv4Address 需要转为 IPv6 的 IPv4 地址
- * @return string | false 传入有效的 IPv4 地址时返回转换后的 IPv6 地址,否则返回false
- */
- function IPv4ToIPv6($IPv4Address){
- if(!is_string($IPv4Address)){
- return false;
- }
- if(preg_match('%^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$%', $IPv4Address, $match)){
- $IPParts = array();
- for($i=1; $i<=4; $i++){
- $IPPart = (int)$match[$i];
- if($IPPart > 255){
- return false;
- }
- $IPParts[$i] = str_pad(decHex($IPPart), 2, '0', STR_PAD_LEFT);
- }
- $IPv6Address = '0:0:0:0:0:ffff:' . $IPParts[1] . $IPParts[2] . ':' . $IPParts[3] . $IPParts[4];
- return $IPv6Address;
- }
- return false;
- }
复制代码 |
|