Как я могу просто проверить, является ли строка действительным IP в PHP? - PullRequest
11 голосов
/ 29 апреля 2011

Как с помощью PHP проверить, является ли строка действительным IP-адресом?

Примеры допустимых строк:

  • 192.158.5.95
  • 121.212
  • 12.12.12.204

Примеры недопустимых строк:

  • 121
  • 10 12 12 (без точек)

Мой текущий скрипт использует этот код, но этого недостаточно для моих нужд:

if(strpos($input, '.') !== false)
{    
  // There is a period 
} 
else 
{     
  // No Period 
} 

Как так, кто-то может посоветовать, как я могу проверить, что строка является действительным IP?

Ответы [ 6 ]

36 голосов
/ 03 мая 2011

Попробуйте это с filter_var

Пример:

if(filter_var('127.0.0.1', FILTER_VALIDATE_IP) !== false) {
    // is an ip
} else {
    // is not an ip
}

Если у вас есть строка типа foo, 127.0.0.blaили аналогичный filter_var вернет false.Допустимые IP-адреса, такие как 10.1.10.10, ::1, считаются действительными.

Уведомление

Также необходимо проверить !== false, поскольку filter_var возвращаетзначение, если оно действительно, и false, если это не так (например, filter_var("::1", FILTER_VALIDATE_IP) вернет ::1, не true).

Флаги

Вы также можете использовать некоторые из следующих флагов:

FILTER_FLAG_IPV4 (фильтр для IPV4)

FILTER_FLAG_IPV6 (фильтр для IPV6)

FILTER_FLAG_NO_PRIV_RANGE (Запретить IP-адреса из частного диапазона)

FILTER_FLAG_NO_RES_RANGE (Запретить IP-адреса из зарезервированного диапазона)

filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE)

Если $ip равно 127.0.0.1функция вернет false.

Уведомление Неудобно ::1 нормально для FILTER_FLAG_NO_PRIV_RANGE, но 127.0.0.1 нет.

24 голосов
/ 29 апреля 2011
$valid = ip2long($ip) !== false;
1 голос
/ 03 мая 2011

На случай, если кто-то не захочет использовать функцию ip2long, вот простая функция (идея взята из класса в osTicket):

function is_ip( $ip = null ) {

    if( !$ip or strlen(trim($ip)) == 0){
        return false;
    }

    $ip=trim($ip);
    if(preg_match("/^[0-9]{1,3}(.[0-9]{1,3}){3}$/",$ip)) {
        foreach(explode(".", $ip) as $block)
            if($block<0 || $block>255 )
                return false;
        return true;
    }
    return false;
}
0 голосов
/ 29 мая 2015

Если @Tomgrohl выдает регулярные выражения, вы можете сделать это в одной строке:

function is_ip($ip) {
    return is_string($ip) && preg_match('/^([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-5][0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-5][0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-5][0-5])\.([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-5][0-5])$/');
}

Пояснение:

/ // regex delimiter
    ( // start grouping
        [0-9] // matches from 0 to 9
        | // or
        [1-9][0-9] // matches from 10 to 99
        | // or
        1[0-9]{2} // matches from 100 to 199
        | // or
        2[0-5][0-5] // matches from 200 to 255
    ) stop grouping
    \. // matches the dot
    // the rest (same) of the numbers
/ regex delimiter

Онлайн тестер: https://regex101.com/r/eM4wB9/1
Примечание: соответствует только ipv4

0 голосов
/ 29 декабря 2014
<?php
$ip = "192.168.0.1";    
if(filter_var($ip, FILTER_VALIDATE_IP))
{
  echo "IP is valid";
} else
{
  echo "IP is not valid";
}
?> 
0 голосов
/ 14 июля 2011

В iNaD все верно, версия filter_var () - самая лучшая - ip2long () - на самом деле , что не сбойПросто попробуйте вставить некоторые странные вещи и убедитесь сами.Я сделал проверку производительности, и filter_var намного быстрее, чем обычные версии регулярных выражений.

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