Если вы не собираетесь использовать подстановочные знаки в качестве 123.3.2*.3
, которые будут соответствовать любому IP от 123.3.20.3
до 123.3.29.3
, тогда приведенное ниже решение будет работать нормально.
Зацикливание на IP-адресах в массиве, и если в нем есть подстановочный знак, создайте два новых IP-адреса - один, где подстановочный знак *
заменяется на 0, другой заменяется на 255. Это нижнийи верхний предел.Затем вы преобразуете его в целое число вместо IP-строки, используя функцию ip2long()
.Делайте это как с самим IP, так и со значением в массиве, когда вы их зацикливаете.
Тогда нужно только сравнить их, чтобы они фактически находились между верхним и нижним пределом.
Если в строке нет подстановочных знаков, сделайте прямое сравнение.
$allowedIps = ['123.2.*.*', '123.3.2.3', '123.3.*.3'];
$IP = '123.3.1.3';
$match = 0;
foreach ($allowedIps as $allowed) {
// If there is no wildcard, we check for the specific IP instead, and not a range
if (strpos($allowed, "*") !== false) {
$lowest = str_replace("*", "0", $allowed);
$highest = str_replace("*", "255", $allowed);
if (ip2long($IP) >= ip2long($lowest) && ip2long($IP) <= ip2long($highest)) {
echo "$IP matched $allowed";
$match = 1;
break;
}
} elseif (ip2long($IP) === ip2long($allowed)) {
echo "Matched ".$allowed;
$match = 1;
break;
}
}
Вероятно, даже не понадобится условие для проверки наличия подстановочных знаков, поскольку оно ничего не заменит, и оба условия в последующем условии if
будут истинными.
Справедливое предупреждение , я не полностью проверил это, и могут быть некоторые неясные случаи, когда условия могут не работать.Возможно, вам лучше сделать это и вне PHP.