@Arh1diablo
Web мастер

Регулярные выражения для диапазона IP адресов?

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

77.88.0.0 - 77.88.0.18
77.88.22.0 – 77.88.23.255

Сам написал регулярные выражения:
$range1 = "77.88.0.[0-1][0-9]";
$range2 = "77.88.2[2-3].[0-2][0-9][0-9]";


Но к примеру вот такой код пишет, что не найдено:
if (preg_match("77.88.0.3",$range1)) {
    echo "Вхождение найдено.";
} else {
    echo "Вхождение не найдено.";
}


Вопросы:

Подскажите, что делаю не так?
Правильно ли написал регулярные выражения? ( если нет, то как правильно для таких диапазонов написать регулярные выражения ) ?
  • Вопрос задан
  • 358 просмотров
Решения вопроса 3
abyrvalg
@abyrvalg
Проверять такие вещи регулярками - в корне неправильно. ИП-адрес - это всего лишь 32-битное целое число. В каждой операционке и почти в каждом языке есть функции для работы с ип-адресами и диапазонами. Пхп не исключение:

$firstIpAsString = '77.88.0.0';
$lastIpAsString  = '77.88.0.18';
$ipAsString      = '77.88.0.111';

$firstIp = ip2long($firstIpAsString);
$lastIp  = ip2long($lastIpAsString);
$ip      = ip2long($ipAsString);

var_export([
    'first' => $firstIp,
    'last' => $lastIp,
    'ip' => $ip,
    'in range?' => $firstIp <= $ip && $ip <= $lastIp,
], false);
Ответ написан
Комментировать
longclaps
@longclaps
$range1 = "77\.88\.0\.[0-1]?\d";
А вообще диапазон - он и есть диапазон, приводишь ip к целому и проверяешь, в границах ли он.
Ответ написан
Комментировать
@DanKud
Как вам уже и написали, для выборки диапазона IP-адресов лучше преобразовывать их в целые числа. Но если регулярками, то в вашем случае можно так:
$range1 = "77\.88\.0\.([0-9]$|[1][0-8]$)";
$range2 = "77\.88\.(22|23)\.[0-9]+$";
или в одну строку:
$range = '(77\.88\.0\.([0-9]$|[1][0-8]$)|77\.88\.(22|23)\.[0-9]+$)';
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы