先把 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; }