Функция PHP для проверки IPv4 и IPv6 с использованием regex

Мне нужно создать функцию для 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. Также неплохо было бы проверить здравый смысл на вышеупомянутой концепции функций.

Ответы

Ответ 1

Edit

Пожалуйста, см. комментарий Natxet на этот ответ, и Morgon ответит за лучшее решение.

Оригинальный ответ

Вы можете просто использовать inet_pton. Он возвращает false, если IP не является допустимым IPv6 или IPv4:

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

Ответ 2

Проверьте PHP filter_var. Он имеет количество валидаторов, включая IPv4 и IPv6.

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

Ответ 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));

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

Ответ 5

Try:

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/

Ответ 6

В дополнение к ответам 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