↓ Archives ↓

Posts Tagged → snippet

PHP Snippet: ip4_in_range

ip 范围检测函数,老生常谈了,贴一下自己造的轮子:

function ip4_in_range ($ip, $start, $end = null) {
    if (func_num_args() === 2) {
        if (strpos($start, '*') !== false) {
            $end = str_replace('*', '255', $start);
            $start = str_replace('*', 0, $start);
        } elseif (strpos($start, '/') !== false) {
            $ip_dec = ip2long($ip);
            list($range, $netmask) = explode('/', $start);
            $netmask_dec = ~ (pow(2, (32 - intval($netmask))) - 1);
            $range_dec = ip2long($range);
            return (($ip_dec & $netmask_dec) === ($range_dec & $netmask_dec));
        } else {
            trigger_error('ip4_in_range: Parameter $start maybe in invalid format.');
            return false;
        }
    }
    extract(array_map(function ($ip) {
        return (float) sprintf("%u", ip2long($ip));
    }, compact('ip', 'start', 'end')));
    if ($start > $end) {
        list($start, $end) = array($end, $start);
    }
    return ($ip >= $start && $ip <= $end);
}

只简单的做了几个小测试,都通过了。用法:

  • ip4_in_range('10.0.1.13', '10.0.1.0/24');
  • ip4_in_range('10.0.1.13', '10.0.1.*');
  • ip4_in_range('10.0.1.13', '10.0.1.10', '10.0.1.20');