Как проверить подсеть ip-адресов на вхождение в другую подсеть на PHP?
@hanna_jacobson
Для проверки вхождения одной подсети IP-адресов в другую подсеть на PHP можно использовать следующий код:
1 2 3 4 5 6 7 |
function is_subnet($subnet, $ip) { $subnet_arr = explode('/', $subnet); $subnet_ip = ip2long($subnet_arr[0]); $subnet_mask = ~((1 << (32 - $subnet_arr[1])) - 1); $ip_long = ip2long($ip); return (($ip_long & $subnet_mask) == $subnet_ip); } |
Эта функция принимает два параметра: $subnet и $ip. $subnet - это подсеть, которую мы хотим проверить на вхождение в другую подсеть, а $ip - это IP-адрес, который мы хотим проверить.
Функция разбивает $subnet на IP-адрес и маску подсети, используя функцию explode(). Затем она преобразует IP-адрес подсети и IP-адрес, который мы хотим проверить, в числовые значения с помощью функции ip2long(). Затем функция вычисляет маску подсети, инвертирует ее и применяет к IP-адресу, который мы хотим проверить. Затем она сравнивает результат с IP-адресом подсети и возвращает true, если они совпадают, и false в противном случае.
Пример использования функции:
1 2 3 4 5 6 7 8 |
$subnet = '192.168.1.0/24'; $ip = '192.168.1.10'; if (is_subnet($subnet, $ip)) { echo "IP-адрес $ip находится в подсети $subnet"; } else { echo "IP-адрес $ip не находится в подсети $subnet"; } |
В этом примере функция is_subnet() проверяет, находится ли IP-адрес 192.168.1.10 в подсети 192.168.1.0/24. Если IP-адрес находится в подсети, то будет выведено сообщение "IP-адрес 192.168.1.10 находится в подсети 192.168.1.0/24", в противном случае будет выведено сообщение "IP-адрес 192.168.1.10 не находится в подсети 192.168.1.0/24".
@hanna_jacobson
Вот функция на PHP, которая проверят подсеть напрямую без перевода в int:
1 2 3 4 5 6 7 8 9 |
function is_subnet($subnet, $ip) {
list($subnet_ip, $subnet_mask) = explode('/', $subnet);
$subnet_ip = ip2long($subnet_ip);
$ip_long = ip2long($ip);
$ip_masked = $ip_long & ~((1 << (32 - $subnet_mask)) - 1);
return $ip_masked === $subnet_ip;
}
|
Эта функция проверяет, находится ли IP-адрес $ip в подсети $subnet.
Пример использования функции:
1 2 3 4 5 6 7 8 |
$subnet = '192.168.1.0/24';
$ip = '192.168.1.10';
if (is_subnet($subnet, $ip)) {
echo "IP-адрес $ip находится в подсети $subnet";
} else {
echo "IP-адрес $ip не находится в подсети $subnet";
}
|
В данном примере будет выведено сообщение "IP-адрес 192.168.1.10 находится в подсети 192.168.1.0/24".