PHP查找IP范围重叠

PHP查找IP范围重叠,php,ip,range,overlap,Php,Ip,Range,Overlap,可能重复: 在PHP中,我有一个IP文件,格式如下: x、 x.x.x(单ip) x、 x.x.x/x(CIDR) x、 x.x.x-x.x.x.x(ip范围) 其中每个x为0到255 我想制作一个PHP文件,将其优化为一个IP范围列表,范围尽可能少(加入重叠条目)。第一部分,获取一组唯一的IP范围可以这样做(注意:没有检查有效数据) 函数cidrToIps($cidr){ 列表($base,$bits)=分解('/',$cidr); 列表($a,$b,$c,$d)=分解('.',$base)

可能重复:

在PHP中,我有一个IP文件,格式如下:

  • x、 x.x.x(单ip)
  • x、 x.x.x/x(CIDR)
  • x、 x.x.x-x.x.x.x(ip范围)
  • 其中每个x为0到255


    我想制作一个PHP文件,将其优化为一个IP范围列表,范围尽可能少(加入重叠条目)。

    第一部分,获取一组唯一的IP范围可以这样做(注意:没有检查有效数据)

    函数cidrToIps($cidr){
    列表($base,$bits)=分解('/',$cidr);
    列表($a,$b,$c,$d)=分解('.',$base);
    
    $i=($a)它看起来有点低效。
    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);