IPV4与IPV6 PHP函数

IPV4与IPV6 PHP函数,php,ipv6,ipv4,Php,Ipv6,Ipv4,我一直在读关于如何确定IP是IPv4还是IPv6的书,很明显,我要寻找的是是否有冒号。但是,您有IPv4映射的IPv6地址和IPv4兼容的IPv6地址。在我看来,这些类型的地址既有冒号又有句点,因此,与其在字符串开头查找是否没有::ffff,不如这样做: function isIPv6($ip) { if(strpos($ip, ":") !== false && strpos($ip, ".") === false) { return true; } re

我一直在读关于如何确定IP是IPv4还是IPv6的书,很明显,我要寻找的是是否有冒号。但是,您有IPv4映射的IPv6地址和IPv4兼容的IPv6地址。在我看来,这些类型的地址既有冒号又有句点,因此,与其在字符串开头查找是否没有
::ffff
,不如这样做:

function isIPv6($ip) {
  if(strpos($ip, ":") !== false && strpos($ip, ".") === false) {
     return true;
  }
  return false;
}
编辑:我是否遗漏了一些东西,或者该函数在所有情况下都能正常工作?

PHP=>5.2有一种“内置”方法,可以使用

您的函数可以如下所示:

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
   }

}
发件人:

您只能验证IPv6的纯格式。 我也建议使用


假设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的方式,从中可以看出。

这是一个问题吗?您似乎提供了一个检测IPv6的功能。您可以查看IP的长度吗?或者您可以让自己轻松使用。Shivan,我的问题是上述功能是否在所有情况下都能正常工作。类,IP的长度似乎不是最佳解决方案,尤其是在使用速记符号时。Jared,这似乎比上面这样一个简单的函数更昂贵-如果它工作正常。如果它工作正常?你相信你想相信的。问题是
12:29 AM
实际上会返回true。你的评价太简单了。如果你想自己实现它,那么你应该考虑使用正则表达式来实现它。好吧,这是假设这个函数几乎可以用于任何输入。此功能旨在与有效的IP地址一起使用。我们已经假设输入是IPv4 IP或IPv6 IP。并非每个函数都需要超级验证所有内容,以确保输入一开始就有效。使用该函数的程序员也需要一些常识…唉。看看这个。看看第一项,在这种情况下,它不是用户输入。它将是$\u SERVER[“REMOTE\u ADDR”]变量。我所说的“输入”是指函数的输入。我不明白为什么在这种特定情况下需要进行任何验证。@JJohnson根据服务器的设置,
$\u server['REMOTE\u ADDR']
很可能不是远程用户的IP地址。您的代码最终将在其他上下文中得到重用,在这些上下文中应该更严格地验证代码。最好第一次就把它做好。从技术上讲,双IPv6不就是半IPv6格式的IPv4吗?函数中的逻辑基本上是
返回strpos($ip,,:')!==虚假的:)
function isIPv6($address) 
{
    return strpos($address, ':') !== false;
}
function isIPv6($address) 
{
    return filter_var($address, FILTER_VALIDATE_IP) && 
        strpos($address, ':') !== false;
}