先把 IP段的 IP转二进制 (192.168.1.1)
子网掩码 转为二进制 (24)
IP段的二进制 和 子网掩码二进制 按位与 (PHP 位与符号 &)
得到结果保存起来;
把要查询的IP地址 转二进制 然后和 上面的 子网掩码二进制 按位与
得到的结果 和 上面 位与结果 对比,如果相同 就是 IP在此IP段内。
//$ip 要查询的IP地址
//$network IP 段 例: 192.168.1.1/24
function ip_in_network2($ip, $network){
$s = explode('/', $network);
$iper = decbin(ip2long($s['0']));
$maskBin = mask2binary($s['1']);
$ipnet = ($iper & $maskBin);
$cip = decbin(ip2long($ip));
$cipnet = ($cip & $maskBin);
if($ipnet == $cipnet){
return true;
}else{
return false;
}
}
//两位数 子网掩码 转 二进制
function mask2binary($mask){
if ($mask > 32) {
$this->error('错误的子网掩码!');
}
$str = array();
for ($i=0; $i < $mask; $i++) {
$str['0'] .= '1';
}
$we = 32-$mask;
$str2 = array();
for ($i=0; $i < $we; $i++) {
$str2['0'] .= '0';
}
$bin = $str['0'].$str2['0'];
return ($bin);
}
这是网上转载的,也可以使用。
####################################################
别人写的方法:
/*
判断指定IP 是否在一个IP段里
$ip 指定IP
$net IP段 例:192.168.1.255/24
*/
function ip_in_network($ip, $network)
{
$ip = (double) (sprintf("%u", ip2long($ip)));
$s = explode('/', $network);
$network_start = (double) (sprintf("%u", ip2long($s[0])));
$network_len = pow(2, 32 - $s[1]);
$network_end = $network_start + $network_len - 1;
if ($ip >= $network_start && $ip <= $network_end)
{
return true;
}
return false;
}