Function that checks if given IP is within one of given IP ranges.
<?php
/**
* Checks if given IP is in one of IP ranges
* @param string|int $ip in format x.x.x.x or unsigned int
* @param string[] $ranges in format IP/NETMASK
* @return bool
*/
function isIpInRanges($ip, $ranges)
{
if (is_numeric($ip))
$ip_dec = $ip;
else
$ip_dec = ip2long($ip);
foreach ($ranges as $range) {
if (strpos($range, '/') === false)
$range .= '/32';
list($range, $netmask) = explode('/', $range, 2);
$x = explode('.', $range);
while (count($x) < 4) $x[] = '0';
$range = sprintf("%u.%u.%u.%u", $x[0], $x[1], $x[2], $x[3]);
$range_dec = ip2long($range);
$wildcard_dec = pow(2, (32 - $netmask)) - 1;
$netmask_dec = ~$wildcard_dec;
if (($ip_dec & $netmask_dec) == ($range_dec & $netmask_dec))
return true;
}
return false;
}
// TESTS
var_dump(isIpInRanges('127.0.0.1', [])); // false
var_dump(isIpInRanges('127.0.0.1', ['127.0.0.1'])); // true
var_dump(isIpInRanges('127.0.0.1', ['127.0.0.0/32'])); // false
var_dump(isIpInRanges('127.0.0.1', ['127.0.0.0/24'])); // true
var_dump(isIpInRanges('1.1.1.1', ['1.0.0.0/16', '1.1.0.0/16'])); // true
var_dump(isIpInRanges('192.168.11.11', ['192.168.11/24'])); // true
var_dump(isIpInRanges('192.168.11.11', ['192.168.11/22'])); // true
var_dump(isIpInRanges('192.168.11.11', ['192.168/29'])); // false
var_dump(isIpInRanges(3000000000, ['178.208.94.0'])); // true
var_dump(isIpInRanges(3000000000, ['178/8'])); // true