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

Использование PHP, как проверить, что строка является допустимым IP?

Примеры действительных строк:

  • 192.158.5.95
  • 121,212
  • 12.12.12.204

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

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

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

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

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

Ответ 1

$valid = ip2long($ip) !== false;

Ответ 2

Попробуйте с 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).

Flags

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

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.

Примечание Awkwardly ::1 подходит для FILTER_FLAG_NO_PRIV_RANGE, но 127.0.0.1 не является.

Ответ 3

На всякий случай, если кто-то, кто не хочет использовать функцию 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;
}

Ответ 4

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

Ответ 5

<?php
$ip = "192.168.0.1";    
if(filter_var($ip, FILTER_VALIDATE_IP))
{
  echo "IP is valid";
} else
{
  echo "IP is not valid";
}
?> 

Ответ 6

Если @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