PHP函数使用正则表达式验证IPv4和IPv6

时间:2012-03-07 19:42:29

标签: php regex string validation

我需要为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的内容。此外,对上述函数概念的完整性检查也会很好。

7 个答案:

答案 0 :(得分:47)

检查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 :(得分:20)

修改

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

原始答案

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

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

答案 2 :(得分:11)

//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));

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

答案 3 :(得分:2)

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

答案 4 :(得分:2)

尝试:

的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/

答案 5 :(得分:1)

除了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

答案 6 :(得分:0)

好吧,我知道这个问题是针对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