Skip to content

Instantly share code, notes, and snippets.

@KarelWintersky
Created October 11, 2015 22:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save KarelWintersky/30c0ffc0f37155b3d6fd to your computer and use it in GitHub Desktop.
Save KarelWintersky/30c0ffc0f37155b3d6fd to your computer and use it in GitHub Desktop.
KW: IP functions
<?php
/* EXAMPLES
$ip="127.0.12.7"; // IP для проверки
$test_ip=explode(".",$ip);
$range="127.0.0.0/22"; // Маска подсети
$chk=range_parser($range);
chk_ips($test_ip,$chk[0],$chk[1]); // FALSE
$range="127.0.0.0-127.1.0.255"; // Интервал IP-адресов
$chk=range_parser($range);
chk_ips($test_ip,$chk[0],$chk[1]); // TRUE
$range="127.0.12.2"; // Одиночный IP
$chk=range_parser($range);
chk_ips($test_ip,$chk[0],$chk[1]); // FALSE
$range="127.*.*.*"; // Маска IP
$chk=range_parser($range);
chk_ips($test_ip,$chk[0],$chk[1]); // TRUE
//*/
<?php
/* === ПРОВЕРКА IP === */
/**
* Проверка вхождения IP4 в заданный диапазон
* @param $ip - массив октетов проверяемого IP
* @param $ip_start - массив октетов начала интервала
* @param $ip_end - массив октетов конца интервала
* В интервалах допускаются маски '*'
* @return bool - TRUE или FALSE, входит IP или нет в диапазон
*
* http://www.manhunter.ru/webmaster/39_proverka_prinadlezhnosti_ip_adresa_zadannomu_diapazonu.html
*/
function chk_ips($ip, $ip_start, $ip_end)
{
if (!isset($ip_start)) $ip_start = array('*', '*', '*', '*');
if (!isset($ip_end)) $ip_end = array('*', '*', '*', '*');
for ($i = 0; $i < 4; $i++) {
if ($ip_start[$i] == '*') $ip_start[$i] = '0';
if ($ip_end[$i] == '*') $ip_end[$i] = '255';
}
$test_ip = kw_ip2long(join('.', $ip));
$range_start = kw_ip2long(join('.', $ip_start));
$range_end = kw_ip2long(join('.', $ip_end));
/* if (($test_ip >= $range_start) && ($test_ip <= $range_end)) {
// IP входит в интервал
return true;
} else {
// IP не входит в интервал
return false;
} */
return !!(($test_ip >= $range_start) && ($test_ip <= $range_end));
}
/**
* Преобразование IP4 по модулю
* @param string $ip
* @return int
*/
function kw_ip2long($ip)
{
if (($r = ip2long($ip)) < 0) {
$r += 4294967296;
}
return $r;
}
/**
* Функция разворачивания маски подсети
* @param $ip массив октетов начала диапазона
* @param $mask маска
* @return array массив IP конца диапазона
*/
function addip($ip, $mask)
{
// Количество IP в каждой маске
$ip_count = Array(32 => 0, 31 => 1, 30 => 3, 29 => 7, 28 => 15, 27 => 31, 26 => 63,
25 => 127, 24 => 255, 23 => 511, 22 => 1023, 21 => 2047, 20 => 4095,
19 => 8191, 18 => 16383, 17 => 32767, 16 => 65535, 15 => 131071,
14 => 262143, 13 => 524287, 12 => 1048575, 11 => 2097151,
10 => 4194303, 9 => 8388607, 8 => 16777215, 7 => 33554431,
6 => 67108863, 5 => 134217727, 4 => 268435455, 3 => 536870911,
2 => 1073741823);
$x = Array();
$ips = $ip_count[$mask];
$x[0] = $ip[0] + intval($ips / (256 * 256 * 256));
$ips = ($ips % (256 * 256 * 256));
$x[1] = $ip[1] + intval($ips / (256 * 256));
$ips = ($ips % (256 * 256));
$x[2] = $ip[2] + intval($ips / (256));
$ips = ($ips % 256);
$x[3] = $ip[3] + $ips;
return ($x);
}
/**
* Парсер диапазонов IP
* @param $range строка диапазона
* @return array|bool Массив из двух массивов ([0]=>ip_start, [1]=>ip_end) или FALSE если строка не является допустимым диапазоном
*/
function range_parser($range)
{
$range = trim($range);
// Проверка диапазона вида x.x.x.x-y.y.y.y
if (strpos($range, "-")) {
$tmp = explode("-", $range);
$ip_start = explode(".", trim($tmp[0]));
$ip_end = explode(".", trim($tmp[1]));
} // Проверка диапазона вида x.x.x.x/y
elseif (strpos($range, "/")) {
$tmp = explode("/", $range);
$ip_start = explode(".", $tmp[0]);
// Развернуть маску подсети
$ip_end = addip($ip_start, $tmp[1]);
} // Проверка диапазона вида x.x.*.* или одиночного IP
else {
$ip_start = $ip_end = explode(".", $range);
}
// Простенькая проверка на корректность полученных диапазонов
if (count($ip_start) == 4 && count($ip_end) == 4) {
return array($ip_start, $ip_end);
} else {
return false;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment