rock\sanitize\rules\Ip::rangeUsingCIDR PHP Метод

rangeUsingCIDR() защищенный Метод

protected rangeUsingCIDR ( string $input ) : string
$input string
Результат string
    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);
    }