3

我一直在阅读有关如何确定 IP 是 IPv4 还是 IPv6 的内容,对我来说,要寻找的东西是是否有冒号似乎很明显。但是,您有 IPv4 映射的 IPv6 地址和 IPv4 兼容的 IPv6 地址。在我看来,这些类型的地址既有冒号又有句点,所以与其寻找::ffff字符串开头是否有 no 的解决方案,不如这样做:

function isIPv6($ip) {
  if(strpos($ip, ":") !== false && strpos($ip, ".") === false) {
     return true;
  }
  return false;
}

编辑:我是否遗漏了什么或者这个功能在所有情况下都能正常工作?

4

3 回答 3

5

PHP => 5.2 有一个使用filter_var的“内置”方法来做到这一点

您的函数可能如下所示:

function isIPv6($ip) {

   if(filter_var($ip, FILTER_VALIDATE_IP)) {

       if(filter_var($ip, FILTER_FLAG_IPV6)) {
          //It is IPv6 indeed.
        } else {
          //It is IPv4
       }

   } else {
      // NOT VALID IP
   }

}
于 2013-03-28T06:20:53.533 回答
3

来自IBM

An IPv6 address can have two formats:

    Normal - Pure IPv6 format
    2001 : db8: 3333 : 4444 : 5555 : 6666 : 7777 : 8888
    Dual - IPv6 plus IPv4 formats
    2001 : db8: 3333 : 4444 : 5555 : 6666 : 1 . 2 . 3 . 4

您仅验证 IPv6 的纯格式。我还建议使用FILTER_FLAG_IPV4 或 FILTER_FLAG_IPV6

function isIPv6($ip) {
  if(strpos($ip, ":") !== false && strpos($ip, ".") === false) {
     return true; //Pure format
  }
  elseif(strpos($ip, ":") !== false && strpos($ip, ".") !== false){
    return true; //dual format
  }
  else{
  return false;
  }
}
于 2013-03-28T06:23:33.390 回答
1

假设 IP 地址是有效的并且知道您可以拥有 IPv6 映射的 IPv4 地址,例如::ffff:127.0.0.1,只检查是否存在:就足够了。

function isIPv6($address) 
{
    return strpos($address, ':') !== false;
}

如果它可能无效,则应首先对其进行验证:

function isIPv6($address) 
{
    return filter_var($address, FILTER_VALIDATE_IP) && 
        strpos($address, ':') !== false;
}

顺便说一句,这也是 PHP 处理 IPv6 的方式,正如您从源代码中看到的那样。

于 2013-03-28T06:38:33.063 回答