IPV4与IPV6 PHP功能

时间:2013-03-28 06:12:09

标签: php ipv6 ipv4

我一直在阅读有关如何确定IP是IPv4还是IPv6的问题,而且对我而言,显而易见的是,是否存在冒号。但是,您具有IPv4映射的IPv6地址和IPv4兼容的IPv6地址。在我看来,这些类型的地址都有冒号和句点,所以不是寻找字符串开头是否没有::ffff的解决方案,为什么不这样做呢?

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

编辑:我错过了什么或者这个功能在所有情况下都能正常工作吗?

3 个答案:

答案 0 :(得分: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
   }

}

答案 1 :(得分: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 or 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;
  }
}

答案 2 :(得分: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的方式,你可以从the source看到。