【问题标题】:Interested in making a PHP script that increments IP address from defined starting address to defined ending address有兴趣制作一个 PHP 脚本,将 IP 地址从定义的起始地址增加到定义的结束地址
【发布时间】:2020-05-30 22:23:43
【问题描述】:

我知道我可以通过首先使用 PHP 内置函数(如 up2longlong2ip)将 IP 地址转换为十进制表示法轻松做到这一点。我只是希望能够使用标准 IP 地址表示法做同样的练习。

我想的问题是这样的:给定一个起始 IP 地址,比如 192.168.1.100,和一个结束 IP 地址,比如 201.130.22.10。制作打印该范围内所有地址号的程序(192.168.1.100、192.168.1.101、...、201.130.22.9、201.130.22.10)。

我在想,也许要走的路是在while 条件内创建一个嵌套的for 循环,直到起始地址的第一个八位字节与结束地址的第一个八位字节匹配。然后为第二个八位字节执行相同的代码块,依此类推,直到程序到达结束地址并完成。

我最近才开始学习编程,所以我的思考和/编写代码很可能远非优雅。如果你要这样做,你会怎么做?

【问题讨论】:

    标签: php ip-address range


    【解决方案1】:

    类似这样的:

    <?php
    
    // works only for valid range
    $start_ip = '10.0.0.1';
    $end_ip = '10.0.20.1';
    
    $start_arr = explode('.',$start_ip);
    $end_arr = explode('.',$end_ip);
    
    while($start_arr <= $end_arr)
    {
        echo implode('.',$start_arr) . '<br>';
    
        $start_arr[3]++;
        if($start_arr[3] == 256)
        {
            $start_arr[3] = 0;
            $start_arr[2]++;
            if($start_arr[2] == 256)
            {
                $start_arr[2] = 0;
                $start_arr[1]++;
                if($start_arr[1] == 256)
                {
                    $start_arr[1] = 0;
                    $start_arr[0]++;
                }
            }
        }
    }
    
    ?>
    

    【讨论】:

    • 是的!!!谢谢!!!!它有效,我认为它比我之前编写的代码更有效,我一直在为此编写一些代码,但由于我不在计算机上,所以我只使用笔和纸。会在我之前给它并在我有我的时候发布它。您的脚本就像一个魅力,再次感谢。
    【解决方案2】:

    这要简单得多:

    <?php
    
    // works only for valid range
    $start_ip = ip2long('10.0.0.1');
    $end_ip = ip2long('10.0.20.1');
    
    while($start_ip <= $end_ip){
      echo long2ip($start_ip).'<br>';
      $start_ip++;
    }
    
    ?>
    

    【讨论】:

      【解决方案3】:
      function getInBetweenIPs($startIP,$endIP){
      
          $subIPS = array();
          $start_ip = ip2long($startIP);
          $end_ip = ip2long($endIP);
      
          while($start_ip <= $end_ip){
              $subIPS[]=long2ip($start_ip);
              $start_ip++;
          }
      
          return $subIPS;
      }
      

      【讨论】:

        【解决方案4】:

        增量(添加到):

        <?php
        
        function ipinc($i): string {
            $i = explode(".", $i);
        
            $a = $i[0];
            $b = $i[1];
            $c = $i[2];
            $d = $i[3];
        
            $d++;
        
            if ($d > 255) {
                $d = 0;
                $c++;
            }
        
            if ($c > 255) {
                $c = 0;
                $b++;
            }
        
            if ($b > 255) {
                $b = 0;
                $a++;
            }
        
            if ($a > 255) {
                die("IPv4 Range Exceeded");
            }
        
            return "$a.$b.$c.$d";
        }
        
        ?>
        

        递减(取自):

        <?php
        
        function ipdec($i) {
            $i = explode(".", $i);
        
            $a = $i[0];
            $b = $i[1];
            $c = $i[2];
            $d = $i[3];
        
            $d--;
        
            if ($d < 0) {
                $d = 255;
                $c--;
            }
        
            if ($c < 0) {
                $c = 255;
                $b--;
            }
        
            if ($b < 0) {
                $b = 255;
                $a--;
            }
        
            if ($a < 0) {
                die("IPv4 Range Exceeded");
            }
        
            return "$a.$b.$c.$d";
        }
        
        ?>
        

        要测试这两个函数,您可以编写一个 for 循环来来回生成大约 1600 万个 IP 地址,您可以将输出通过管道传输到文件并以这种方式存储结果。

        <?php
        
        require 'function.ipinc.php';
        require 'function.ipdec.php';
        
        print("Increment:\n");
        for ($i = 0, $ip = "100.0.0.0"; $i <= 16777215; $i++) {
            print("$ip\n");
            $ip = ipinc($ip);
        }
        print("----------\n");
        
        print("Decrement:\n");
        for ($i = 0, $ip = "100.255.255.255"; $i <= 16777215; $i++) {
            print("$ip\n");
            $ip = ipdec($ip);
        }
        print("----------\n");
        
        die("Finished!\n");
        
        ?>
        

        如果您不喜欢通过变量声明分配值,请修改函数以便您可以使用 pass by reference 代替。

        【讨论】:

          猜你喜欢
          • 2018-06-08
          • 1970-01-01
          • 2011-10-08
          • 1970-01-01
          • 2011-12-01
          • 2013-03-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多