PHP 判断指定IP,是否在一个IP段里

时间:2021-05-17 09:58:46


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