可能重复:
need an algorithm for collapsing netblock ranges into lists of superset ranges
在PHP中,我有一个IP格式的文件,格式如下:
其中每个x为0到255。
我想制作一个PHP文件,将其优化为可能范围最少的IP范围列表(加入重叠条目)。
答案 0 :(得分:1)
第一部分,获取一组独特的IP范围可以这样做(注意:没有检查有效数据)
function cidrToIps($cidr) {
list($base, $bits) = explode('/', $cidr);
list($a, $b, $c, $d) = explode('.', $base);
$i = ($a << 24) + ($b << 16) + ($c << 8) + $d;
$mask = $bits == 0 ? 0 : (~0 << (32 - $bits));
return array_map('long2ip', range($i & $mask, $i | (~$mask & 0xFFFFFFFF)));
}
function rangeToIps($range) {
list($ip1, $ip2) = explode("-", $range);
$ip1int = ip2long($ip1);
$ip2int = ip2long($ip2);
return array_map('long2ip', range($ip1int, $ip2int));
}
$all_ips = array();
function processLine($line) {
global $all_ips;
$line = trim($line);
$ipRex = "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}";
if (preg_match("#^".$ipRex."/[0-9]{1,2}$#", $line)) {
$all_ips = array_merge($all_ips, cidrToIps($line));
} elseif (preg_match("#^".$ipRex."-".$ipRex."$#", $line)) {
$all_ips = array_merge($all_ips, rangeToIps($line));
} else {
$all_ops[] = $line;
}
}
$lines = array('192.168.9.0/22', '192.168.8.45', '192.168.10.10-192.168.10.99');
foreach ($lines as $line) {
processLine($line);
}
$filtered_ips = array_unique($all_ips);
我将把剩下的部分(将其转换回范围,cidrs和ip地址)留给你。