Dopasuj adres IPv4 podany zakres IP / maska?
Albo z PHP, albo z RegExp (lub z obu), jak dopasować zakres adresów IP?
Przykładowe przychodzące adresy IP<code>10.210.12.12 10.253.12.12 10.210.12.254 10.210.12.95 10.210.12.60 </code>Zakresy próbek
<code>10.210.12.0/24 10.210.12.0/16 10.210.*.* 10.*.*.* </code>
Wiem, że mogę to zrobić:
<code>?:(?: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]?) </code>
... ale nie bierze pod uwagę zakresów. Pozwala jedynie dopasować numer przychodzący, aby sprawdzić, czy jest to adres IP, gdzie każdy oktet ma wartość 0-255.
EDYTOWAĆ:
Jest też ta funkcja, którą znalazłem w komentarzu na php.net w funkcji ip2long.
<code>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 </code>
Jest krótki i słodki, ale nie pasuje do sytuacji w gwiazdce. Nie wiem też, czy jest to całkowicie dokładne, ponieważ zwraca prawdziwy wynik, gdy myślałem, że będzie to fałsz:
<code>echo ip_in_network("192.168.2.1","192.167.0.0",1); </code>
... ale może źle zrozumiałem, co będzie / 1. Być może musiałem użyć / 24.