【问题标题】:PHP function to validate IPv4 and IPv6 using regex使用正则表达式验证 IPv4 和 IPv6 的 PHP 函数
【发布时间】:2012-03-25 08:46:53
【问题描述】:

我需要为 IPv4 和 v6 创建一个函数,导致我也使用本地 ip。

我所知道的有效 IPv4 范围是 0.0.0.0 到 255.255.255.255 我对 IPv6 的了解是有限的,尽管它已经存在了一段时间,但直到今天我还没有真正深入研究它。但我想在未来证明我正在制作的功能,同时暂时保持它有点复古。我不确定 IPv6 的有效范围是多少。

无论如何,总的来说,我在想的是一个函数

function validateIP($ip, $vSix = NULL)
{
    if($vSix !== NULL)
    {
      if(preg_match([regex-to-validate-ipv6], $ip))
      {
        return true;
      }
      else
      {
        return false;
      }
    }

    if(preg_match([regex-to-validate-ipv4], $ip))
    {
      return true;
    }
    else
    {
      return false;
    }
}

我的问题是我对正则表达式很烂,所以我不知道如何编写一个可以验证 v4 或 6 的表达式。此外,对上述函数概念进行健全性检查也会很好。

【问题讨论】:

    标签: php regex string validation


    【解决方案1】:

    检查 PHP 的 filter_var 函数。它有一个number of validators,包括IPv4和IPv6。

    $isValid = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
    // $isValid can be evaluated as boolean, as it's FALSE if validation fails.
    

    【讨论】:

    • 好主意,不知道为什么我没记住这一点,但很好的电话 +1
    • $isValid 不是 boolean。来自文档:返回过滤后的数据,如果过滤器失败,则返回 FALSE。
    • @schnittstabil - Younger-me 会说这是迂腐的,但实际上这是一个公平的观点。我已经更新了示例,说明它可以转换为布尔值。
    • @schnittstabil 你是对的,但他说它可以评估作为一个布尔值,这不是不正确的。 IE。即使 filter_var 返回过滤后的数据并且您在条件中使用该数据,它仍然会被评估为 true。
    • @Dillan 请注意,Morgon 写过“我已经更新了示例”……
    【解决方案2】:

    编辑

    请参阅 Natxet 对此答案的评论,以及 Morgon 的答案以获得更好的解决方案。

    原答案

    您可以使用inet_pton。如果 IP 不是有效的 IPv6 或 IPv4,则返回 false:

    function validateIP($ip){
        return inet_pton($ip) !== false;
    }
    

    【讨论】:

    • 伙计,我得在 php.net 上做一些事情,阅读一些我什至没有意识到的新功能。这是非常简单和性感的。我想我会在刚刚读完它之后继续这样做。赞一个!
    • 小心!这个函数会抛出一个警告,请不要在函数名前使用@来消除它。您应该避免使用此功能来检查正确的 IP。正如@marc-pro-campos 指出的那样,return filter_var($ip, FILTER_VALIDATE_IP)); 选项似乎最适合您
    【解决方案3】:

    试试

    //validates IPv4 and IPv6
    $isValid = filter_var($ip, FILTER_VALIDATE_IP);
    
    //validates IPv4
    $isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV4);
    
    //validates IPv6
    $isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV6);
    
    //validates IPv4 and IPv6, excluding reserved and private ranges
    $isValid = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE);
    

    http://www.php.net/manual/en/filter.filters.validate.php

    【讨论】:

      【解决方案4】:

      除了 Morgon 和 Mark Pro Campos 的答案:

      function is_valid_ip($ip='', $ip_type=''){
      
          $isValid=false;
      
          if($ip_type=='ipv4'){
      
              //validates IPV4
              $isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV4);
          }
          elseif($ip_type=='ipv6'){
      
              //validates IPV6
              $isValid = filter_var($ip, FILTER_VALIDATE_IP,FILTER_FLAG_IPV6);
          }
          else{
      
              //validates IPV4 and IPV6
              $isValid = filter_var($ip, FILTER_VALIDATE_IP);
          }
      
          if($isValid == $ip){
      
              $isValid=true;
          }
      
          return $isValid;
      }
      

      资源

      http://php.net/manual/en/function.filter-var.php

      【讨论】:

        【解决方案5】:

        您可能希望改为检查 filter_var。它有一个 IP 地址过滤器(IPv4 和 IPv6):http://us.php.net/manual/en/filter.filters.validate.php

        【讨论】:

          【解决方案6】:

          试试:

          IPv4

          /^((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?1)){3}\z/
          

          IPv6

          /^(((?=(?>.*?(::))(?!.+\3)))\3?|([\dA-F]{1,4}(\3|:(?!$)|$)|\2))(?4){5}((?4){2}|((2[0-4]|1\d|[1-9])?\d|25[0-5])(\.(?7)){3})\z/i
          

          来自: http://home.deds.nl/~aeron/regex/

          【讨论】:

          • 最后的\z是做什么的?
          【解决方案7】:

          好吧,我知道这个问题是针对 php 的——不是明确的 laravel。

          但为了完整起见,我将发布 php laravel 的解决方案。 要检查有效的 ipv4 或 ipv6 地址,请使用以下代码作为验证规则数组中的值:

          // form fieldname to be checked => 'rules ip-separated'
          'field1' => 'required|ipv4', // checks for an ipv4 address + field is required
          'field2' => 'nullable|ipv4', // checks for an ipv6 address + an empty string is valid as well
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-11-02
            • 1970-01-01
            • 2014-12-25
            • 2011-07-14
            • 2022-01-17
            • 2014-06-22
            • 1970-01-01
            相关资源
            最近更新 更多