Преамбула
В IPv4 имеются зарезервированные диапазоны адресов, в некоторых случаях надо проверить, не попал ли адрес в один из них
Таблица зарезервированных адресов
См. в PDF
Или на PasteBin
Надеюсь, ничего не забыл. Таблица нагло выдрана из лекции, но я сверялся с Википедией и другими интернетами.
Вспомогательные функции для проверки
Для порядку заведем регулярное выражение для проверки IP
$ip_pattern="#(?:(?: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 ли вообще у нас на входе:
function isip($ip_str) //соответствие данных формату IP
{
global $ip_pattern;
$ret=FALSE;
if (preg_match($ip_pattern,$ip_str))
{
$ret=TRUE;
}
return $ret;
}
Теперь функцию, которая будет проверять, попал ли IP в нужный диапазон:
function chkdiapip ($user_ip, $ip_from, $ip_to) //попадает ли ip в нужный диапазон
{
return ( ip2long($user_ip)>=ip2long($ip_from) &&
ip2long($user_ip)<=ip2long($ip_to) );
}
Проверка
Создадим двумерный массив со списком диапазонов:
$spec_list = array(
array ("0.0.0.0","0.255.255.255", "Current network"),
array ("255.255.255.255","255.255.255.255", "Broadcast"),
array ("255.0.0.0","255.255.255.255", "Reserved by the IETF, broadcast"),
array ("10.0.0.0","10.255.255.255", "Private network"),
array ("100.64.0.0","100.127.255.255", "Shared Address Space"),
array ("127.0.0.0","127.255.255.255", "Loopback"),
array ("169.254.0.0","169.254.255.255", "Link-local"),
array ("172.16.0.0","172.31.255.255", "Private network"),
array ("192.0.0.0","192.0.0.7", "DS-Lite"),
array ("192.0.0.170","192.0.0.170", "NAT64"),
array ("192.0.0.171","192.0.0.171", "DNS64"),
array ("192.0.2.0","192.0.2.255", "Documentation example"),
array ("192.0.0.0","192.0.0.255", "Reserved by the IETF"),
array ("192.88.99.0","192.88.99.255", "Anycast"),
array ("192.88.99.1","192.88.99.1", "IPv6 to IPv4 Incapsulation"),
array ("192.168.0.0","192.168.255.255", "Private network"),
array ("198.51.100.0","198.51.100.255", "Documentation example"),
array ("198.18.0.0","198.19.255.255", "Test IP"),
array ("203.0.113.0","203.0.113.255", "Documentation example"),
array ("224.0.0.0","224.255.255.255", "Multicast"),
array ("240.0.0.0","240.255.255.255", "Future reserved")
);
И функцию, которая будет все это безобразие в цикле перебирать, и если IP попадет в какой-то из диапазонов - выдаст диапазон и описание. Если не попадет - вернет -1.
function get_spec_diap ($user_ip, $listspec)
{
for ($i=0;$i<sizeof($listspec);$i++)
{
$item = $listspec[$i];
if (chkdiapip($user_ip, $item[0], $item[1]))
{
return $item[0]."\t".$item[1]."\t".$item[2]."\t\n";
}
}
return -1;
}
Ну шоб два раза не вставать, сделаем еще и функцию, оглашающую весь список:
function printspecdiap ($listspec)
{
for ($i=0;$i<sizeof($listspec);$i++)
{
$item = $listspec[$i];
echo $item[0]."\t\t".$item[1]."\t\t\t".$item[2], "\t\t\t\n";
}
}
Скрипт полностью на PasteBin
На GitHub