Posts Tagged → ip
June 30th, 2010
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');
By Leechael • Posted in php • Comments Off