我正在寻找一种将给定IP4点缀四边形IP与CIDR表示掩码匹配的快速/简单方法。
我有一堆IP,我需要查看它们是否与IP范围匹配。
例:
$ips = array('10.2.1.100', '10.2.1.101', '10.5.1.100', '1.2.3.4'); foreach ($ips as $IP) { if (cidr_match($IP, '10.2.0.0/16') == true) { print "you're in the 10.2 subnet\n"; } }
会是什么cidr_match()模样?
cidr_match()
它并不一定必须很简单,但是快速就可以了。仅使用内置/通用功能的任何东西都是一种奖励(因为我很可能会让一个人向我展示梨子中的某些东西,但这样做我不能依赖于梨子或该软件包安装在我的代码所在的位置)部署)。
如果仅使用IPv4:
ip2long()
这样的事情应该工作:
function cidr_match($ip, $range) { list ($subnet, $bits) = explode('/', $range); if ($bits === null) { $bits = 32; } $ip = ip2long($ip); $subnet = ip2long($subnet); $mask = -1 << (32 - $bits); $subnet &= $mask; # nb: in case the supplied subnet wasn't correctly aligned return ($ip & $mask) == $subnet; }