首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP查找IP范围重叠

PHP查找IP范围重叠
EN

Stack Overflow用户
提问于 2011-09-05 04:57:01
回答 1查看 1.4K关注 0票数 0

可能重复:

need an algorithm for collapsing netblock ranges into lists of superset ranges

在PHP中,我有一个带有I的文件,格式如下:

(CIDR)

  • x.x.x.x-x.x.x.x (ip范围)
  1. x.x(单ip)
  2. x.x/x

其中每个x为0到255。

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

EN

回答 1

Stack Overflow用户

发布于 2011-09-05 05:50:16

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

代码语言:javascript
复制
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地址)留给您。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7304015

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档