Совпадение IPv4-адреса с заданным диапазоном/маской IP?

Либо с PHP, либо с RegExp (, либо с обоими ), как мне сопоставить диапазон IP-адресов?

Примеры входящих IP-адресов

10.210.12.12
10.253.12.12
10.210.12.254
10.210.12.95
10.210.12.60

Примеры диапазонов

10.210.12.0/24
10.210.12.0/16
10.210.*.*
10.*.*.*

Я знаю, что могу это сделать:

?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)

...но диапазоны не учитываются. Он просто позволяет вам сопоставить входящий номер, чтобы увидеть, является ли он IP-адресом, где каждый октет равен 0 -255.

EDIT:

Также есть эта функция, которую я нашел в комментарии на php.net к функции ip2long..

function ip_in_network($ip, $net_addr, $net_mask){ 
    if($net_mask <= 0){ return false; } 
        $ip_binary_string = sprintf("%032b",ip2long($ip)); 
        $net_binary_string = sprintf("%032b",ip2long($net_addr)); 
        return (substr_compare($ip_binary_string,$net_binary_string,0,$net_mask) === 0); 
} 

ip_in_network("192.168.2.1","192.168.2.0",24); //true 
ip_in_network("192.168.6.93","192.168.0.0",16); //true 
ip_in_network("1.6.6.6","128.168.2.0",1); //false

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

echo ip_in_network("192.168.2.1","192.167.0.0",1);

... но, возможно, я неправильно понимаю, что такое /1. Возможно, мне нужно было использовать /24.

6
задан Volomike 2 May 2012 в 21:31
поделиться