PHP 多个逗号隔开的ip转化为ip段

这篇博客主要展示了如何将一组IP地址进行排序并压缩成范围形式,如192.168.1.1-192.168.1.3,10.1.24.30-10.1.24.43等。通过PHP函数实现IP地址的整型转换、排序及合并连续IP段,适用于大量IP数据的处理和展示。

需求说明:
192.168.1.1,192.168.1.2,192.168.1.3,192.168.2.1,192.168.2.2
转化为:
192.168.1.1-192.169.1.3,192.168.2.1-192.168.2.2

上代码:


<?php

$ips = '10.1.24.30,10.1.24.31,10.1.24.32,10.1.24.41,10.1.24.45,10.1.24.50,10.1.24.51,10.1.24.56,10.1.65.101,10.1.65.109,10.1.65.117,10.1.65.122,10.1.65.126,10.1.65.128,10.1.65.129,10.1.65.135,10.1.65.21,10.1.65.22,10.1.65.25,10.1.65.27,10.1.65.55,10.1.65.82,10.1.65.86,10.1.65.87,10.1.65.88,10.1.65.92,10.1.65.93,10.1.68.25,10.1.69.102,10.1.69.104,10.1.69.105,10.1.69.108,10.1.69.112,10.1.69.113,10.1.69.114,10.1.69.116,10.1.69.117,10.1.69.118,10.1.69.123,10.1.69.124,10.1.69.127,10.1.69.128,10.1.69.129,10.1.69.130,10.1.69.131,10.1.69.132,10.1.69.133,10.1.69.134,10.1.69.135,10.1.69.136,10.1.69.137,10.1.69.142,10.1.69.143,10.1.69.145,10.1.69.146,10.1.69.148,10.1.69.149,10.1.69.150,10.1.69.151,10.1.69.152,10.1.69.156,10.1.69.157,10.1.69.158,10.1.69.160,10.1.69.167,10.1.69.170,10.1.69.171,10.1.69.172,10.1.69.173,10.1.69.175,10.1.69.176,10.1.69.177,10.1.69.178,10.1.69.179,10.1.69.180,10.1.69.181,10.1.69.182,10.1.69.183,10.1.69.184,10.1.69.188,10.1.69.189,10.1.69.190,10.1.69.191,10.1.69.192,10.1.69.193,10.1.69.194,10.1.69.195,10.1.69.196,10.1.69.197,10.1.69.198,10.1.69.201,10.1.69.202,10.1.69.203,10.1.69.204,10.1.69.205,10.1.24.43,10.1.69.209,10.1.16.179,10.1.69.50';


// echo bindec(decbin(ip2long('10.1.24.30')));//转整型后不带符号,10位   2238855303
// echo "-------";
// echo bindec(decbin(ip2long('10.1.24.31')));//转整型后不带符号,10位   2238855303
// die;

$re = makeIpRangeStr($ips);
$re = implode(',', $re);
var_dump($re);die;

function makeIpRangeStr($ips){
     $ips_arr = explode(",", $ips);
     $ips_arr = ipsort($ips_arr);
     $ips_range_arr = array();
     $res_ips = [];
     foreach ($ips_arr as $key => $value) {
         $value_arr = explode(".", $value);
         $ips_range_arr[$value_arr[0] . "." . $value_arr[1] . "." . $value_arr[2]][] = $value;
     }
     $arr_res = array();
     foreach($ips_range_arr as $key => $value){
        array_push($res_ips,bbb($value));
     }
    $res_ip = [];

    foreach ($res_ips as $key => $value) {
        foreach($value as $v){
            array_push($res_ip, $v);
        }
    }
    return $res_ip;
}

//整理单个ip段
function bbb($arr){
    $length = count($arr);
    $arr_res = array();
    $arr_res_res = array();
    $arr_item = array();
    for($i=0;$i<$length;$i++){
        array_push($arr_item,$arr[$i]);
        if(isset($arr[$i+1])){
            $t1 = explode(".",$arr[$i+1]);
            $t2 = explode(".",$arr[$i]);
            if(end($t1)-end($t2) == 1){
                
            }else{
                array_push($arr_res,$arr_item);
                $arr_item = array();
            }
        }else{
            array_push($arr_res,$arr_item);
        }
        
    }
    
    foreach($arr_res as $value){
        array_push($arr_res_res,$value[0] . "-" . end($value));
    }
    return $arr_res_res;
    // var_dump($arr_res_res);die;
}

function ipsort($ips){
    $intIps=[];
    $ips_arr = [];
    foreach($ips as $ip){
        array_push($intIps,bindec(decbin(ip2long($ip))));
    }
    sort($intIps);
    foreach($intIps as $intIp ){
        array_push($ips_arr,long2ip($intIp));
    }
    return $ips_arr;
}

在不同的操作系统和环境中,将 DNS 服务中的域名解析导出并把多个 IP 地址用逗号隔开的方法有所不同,以下为你提供几种常见场景下的实现方式: ### Linux 系统使用 dig 命令 在 Linux 系统中,可以使用 `dig` 命令进行域名解析,并结合 `awk` 等工具处理输出结果。示例代码如下: ```bash domain="example.com" dig +noall +answer $domain | awk '{ if ($4 == "A") { if (ip != "") { ip = ip "," $5 } else { ip = $5 } } } END { print $1 " " ip }' ``` 上述代码中,首先定义了要查询的域名 `example.com`,然后使用 `dig` 命令查询该域名的 A 记录,`+noall +answer` 选项表示只输出查询结果。接着使用 `awk` 脚本处理输出,将多个 IP 地址用逗号连接起来。 ### Python 脚本实现 使用 Python 的 `dnspython` 库可以方便地进行 DNS 查询,并处理多个 IP 地址。示例代码如下: ```python import dns.resolver domain = "example.com" answers = dns.resolver.query(domain, 'A') ips = [str(rdata) for rdata in answers] ip_str = ','.join(ips) print(f"{domain} {ip_str}") ``` 上述代码中,首先导入 `dns.resolver` 模块,然后定义要查询的域名 `example.com`,使用 `query` 方法查询该域名的 A 记录。将查询结果换为字符串列表 `ips`,最后使用 `join` 方法将多个 IP 地址用逗号连接起来。 ### Windows 系统使用 nslookup 命令 在 Windows 系统中,可以使用 `nslookup` 命令进行域名解析,并结合 PowerShell 脚本处理输出结果。示例代码如下: ```powershell $domain = "example.com" $ips = (nslookup $domain | Select-String -Pattern 'Address: ' | ForEach-Object { $_.ToString().Split(': ')[1].Trim() }) -join ',' Write-Output "$domain $ips" ``` 上述代码中,首先定义了要查询的域名 `example.com`,然后使用 `nslookup` 命令查询该域名的 IP 地址。使用 `Select-String` 筛选出包含 `Address: ` 的行,再使用 `Split` 方法提取 IP 地址,最后使用 `-join` 方法将多个 IP 地址用逗号连接起来。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值