protected function rangeUsingCIDR($input)
{
list($ip, $prefix) = explode('/', $input);
if ($this->isIPv6($ip)) {
if (strpos($prefix, ':') !== false) {
$prefix = strlen(str_replace('0', '', $this->IPv6toBit(inet_pton($prefix))));
}
$minBin = inet_pton($ip);
$min = inet_ntop($minBin);
$maxBin = $minBin = unpack('H*', $minBin)[1];
$prefix = 128 - $prefix;
$pos = 31;
while ($prefix > 0) {
$orig = substr($maxBin, $pos, 1);
$origval = hexdec($orig);
$newval = $origval | pow(2, min(4, $prefix)) - 1;
$new = dechex($newval);
$maxBin = substr_replace($maxBin, $new, $pos, 1);
$prefix -= 4;
$pos -= 1;
}
$max = inet_ntop(pack('H*', $maxBin));
return $this->normalize($min) . '-' . $this->normalize($max);
}
if (strpos($prefix, '.') !== false) {
$prefix = strlen(str_replace('0', '', sprintf('%032b', ip2long($prefix))));
}
return long2ip(ip2long($ip) & -1 << 32 - (int) $prefix) . '-' . long2ip(ip2long($ip) + pow(2, 32 - (int) $prefix) - 1);
}