Как проверить подсеть 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".