简体   繁体   English

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

[英]PHP function to validate IPv4 and IPv6 using regex

I'm needing to create a function for IPv4 and v6 that I cause use local ip's as well.我需要为 IPv4 和 v6 创建一个 function,我也使用本地 ip。

What I know is a valid IPv4 ranges from 0.0.0.0 to 255.255.255.255 What I know of IPv6 is limited however as despite it being around for a while I haven't really looked much into it til today.我所知道的是有效的 IPv4 范围从 0.0.0.0 到 255.255.255.255 我对 IPv6 的了解是有限的,尽管它已经存在了一段时间,但直到今天我还没有真正研究过它。 But I want to future proof the function I am making a little bit while keeping it a bit retro for the time being.但我想在未来证明 function 我正在制作一点,同时暂时保持它有点复古。 I'm not sure what the valid ranges are for IPv6.我不确定 IPv6 的有效范围是多少。

Anyway In general what I am thinking is a function to the extent of无论如何总的来说我在想的是一个function的程度

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;
    }
}

my thing is I suck with regex so I have no idea how to write one that will validate v4 or 6. Also a sanity check on the above function concept would be nice as well.我的事情是我很讨厌正则表达式,所以我不知道如何编写一个可以验证 v4 或 6 的正则表达式。另外,对上述 function 概念进行健全性检查也很好。

Check PHP's filter_var function.检查 PHP 的filter_var函数。 It has a number of validators , including IPv4 and IPv6.它有许多验证器,包括 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.

Edit编辑

Please see Natxet's comment on this answer, and Morgon's answer for a better solution.请参阅 Natxet 对此答案的评论,以及 Morgon 的答案以获得更好的解决方案。

Original Answer原答案

You can just use inet_pton .你可以只使用inet_pton It returns false if the IP is not a valid IPv6 or IPv4:如果 IP 不是有效的 IPv6 或 IPv4,则返回 false:

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

try尝试

//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 http://www.php.net/manual/en/filter.filters.validate.php

In addition to Morgon and Mark Pro Campos answers:除了 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;
}

Resources资源

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

You might want to check into filter_var instead.您可能想改为检查 filter_var。 It has a filter for IP addresses (IPv4 and IPv6): http://us.php.net/manual/en/filter.filters.validate.php它有一个 IP 地址过滤器(IPv4 和 IPv6): http : //us.php.net/manual/en/filter.filters.validate.php

Try:尝试:

IPv4 IPv4

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

IPv6 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

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

Well, i know this question is for php - not explicitly laravel.好吧,我知道这个问题是针对 php - 不是明确的 laravel。

But for the sake of completeness i will post the solution for php laravel.但为了完整起见,我将发布 php laravel 的解决方案。 To check for valid ipv4 or ipv6 addresses use the following code as value in your validation rules array:要检查有效的 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
function verify_ip ($ip)
{
    //ipv4
    if(preg_match('#^(\d{1,3}\.){3}\d{1,3}$#', trim($ip))){
        return true;
    }
    //ipv6
    if(preg_match('#^(((?=(?>.*?(::))(?!.+\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})$#i', trim($ip))){
        return true;
    }
    return false;
        
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM