2011-09-05 67 views

回答

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地址)給你。

+0

它看起來有點低效。 – Victor