Функция PHP для проверки IPv4 и IPv6 с помощью регулярных выражений - PullRequest
16 голосов
/ 07 марта 2012

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

Ответы [ 6 ]

47 голосов
/ 07 марта 2012

Проверьте функцию PHP filter_var. Он имеет количество валидаторов , включая 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.
20 голосов
/ 07 марта 2012

Редактировать

Пожалуйста, посмотрите комментарий Натксета к этому ответу и ответ Моргона для лучшего решения.

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

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

function validateIP($ip){
    return inet_pton($ip) !== false;
}
11 голосов
/ 22 января 2014

1001 * попробовать *

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

2 голосов
/ 17 марта 2012

Попробуйте:

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/

2 голосов
/ 07 марта 2012

Возможно, вы захотите проверить в filter_var.Имеется фильтр для IP-адресов (IPv4 и IPv6): http://us.php.net/manual/en/filter.filters.validate.php

1 голос
/ 03 апреля 2015

В дополнение к ответам Моргона и Марка Про Кампоса:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...