Ответ 1
$valid = ip2long($ip) !== false;
Использование PHP, как проверить, что строка является допустимым IP?
Примеры действительных строк:
Примеры недопустимых строк:
Мой текущий script использует этот код, но этого недостаточно для моих нужд:
if(strpos($input, '.') !== false)
{
// There is a period
}
else
{
// No Period
}
Как таковой, может кто-нибудь, пожалуйста, сообщите, как я могу проверить, что строка является допустимым IP?
$valid = ip2long($ip) !== false;
Попробуйте с 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
не является.
На всякий случай, если кто-то, кто не хочет использовать функцию 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;
}
iNaD ist right, версия filter_var() - самая лучшая - ip2long() действительно не является отказоустойчивой. Просто попробуйте вставить некоторые странные вещи и убедитесь сами. Я выполнил проверку выполнения и filter_var намного быстрее, чем обычные версии регулярных выражений.
<?php
$ip = "192.168.0.1";
if(filter_var($ip, FILTER_VALIDATE_IP))
{
echo "IP is valid";
} else
{
echo "IP is not valid";
}
?>
Если @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