网络开发很多情况下都会遇到这种场景,判断某个IP是否属于某个cidr网段;但php官方并没有提供类似功能函数,以前我的做法都是将IP和整个网段转换为整数,再通过判断整数是否在范围以内,以此确定是否属于此网段,但我觉得方法太笨,于是一番查找,发现一位前辈留下了笔记。
地址:https://www.php.net/manual/en/ref.network.php#74656
笔记说明
A simple and very fast function to check against CIDR.
Your previous examples are too complicated and involves a lot of functions call.
Here it is (only with arithmetic operators and call only to ip2long () and split() ):
版本略旧,我替换了个别函数格式化了一下,代码如下:
/**
* IP CIDR 范围判断
* @param $IP
* @param $CIDR
* @return bool
*/
function ipCIDRCheck($IP, $CIDR): bool
{
[$net, $mask] = explode("/", $CIDR);
$ip_net = ip2long($net);
$ip_mask = ~((1 << (32 - $mask)) - 1);
$ip_ip = ip2long($IP);
$ip_ip_net = $ip_ip & $ip_mask;
return ($ip_ip_net == $ip_net);
}