使用php生成和使用所有IP地址

使用php生成和使用所有IP地址,php,list,for-loop,ip,Php,List,For Loop,Ip,我对java一窍不通(我以为是关于java的同一主题的帖子),对php也略知一二,我想知道如何用php生成所有可能IP的完整列表(0.0.0.0到255.255.255.255)然后,我如何在php脚本中使用这些工具,该脚本旨在测试我正在尝试设置的IP验证工具(使用它们中的每一个) 对于问题的第二部分,我考虑使用foreach语句,或者在循环中使用“测试代码”的一部分来生成每个IP组合,以便在生成IP时对其进行测试 然后在第一部分,我必须承认我被困住了,我的基本知识不能让我找到满意的解决方案 到

我对java一窍不通(我以为是关于java的同一主题的帖子),对php也略知一二,我想知道如何用php生成所有可能IP的完整列表(0.0.0.0到255.255.255.255)然后,我如何在php脚本中使用这些工具,该脚本旨在测试我正在尝试设置的IP验证工具(使用它们中的每一个)

对于问题的第二部分,我考虑使用foreach语句,或者在循环中使用“测试代码”的一部分来生成每个IP组合,以便在生成IP时对其进行测试

然后在第一部分,我必须承认我被困住了,我的基本知识不能让我找到满意的解决方案 到目前为止,我已经得出以下结论:

function gen() {
    $n1 = 0;
    $n2 = 0;
    $n3 = 0;
    $n4 = 0;

    while ($n4 <= 255 && $n3 <= 255) {
        echo $n1.'.'.$n2.'.'.$n3.'.'.$n4++.'<br>';
        echo $n1.'.'.$n2.'.'.$n3++.'.'.$n4.'<br>';
    }
}
gen();
函数gen(){
$n1=0;
$n2=0;
$n3=0;
$n4=0;

虽然($n4而不是为大约40亿个IP4地址生成一个可能的数据库/存储(假设您只查看IPv4而忽略所有IPv6地址),但生成随机IP地址组合以进行测试不是更容易、更实际吗?您可以轻松地用RegEx进行验证

以下正则表达式允许您验证0.0.0.0到255.255.255.255之间的任何特定IPv4地址

\b(25[0-5]| 2[0-4][0-9]|[01]|[0-9][0-9]|

但是,您需要记住的是,并非所有地址组合都被归类为“有效”,即使它们的语法正确

另一种选择(正如@binaryLV所提到的)是使用PHP filter\u var($ip,filter\u VALIDATE\u ip);函数,它很好而且干净

更新

对于基于IP位置的服务,我建议使用这样的服务。它们既提供了一个to-use,允许您调用它们的服务,减少了在数据库中存储信息的需要。否则,它们提供了一个to-xxx.xxx.xxx精度,也可以下载。

您需要嵌套循环:

for($n1=0; $n1 < 256; $n1++) {
    for($n2=0; $n2 < 256; $n2++) {
        for($n3=0; $n3 < 256; $n3++) {
            for($n4=0; $n4 < 256; $n4++) {
                echo $n1 . "." . $n2 . "." . $n3 . "." . $n4 . "\n";
            }
        }       
    }
}   
($n1=0;$n1<256;$n1++)的
{
对于($n2=0;$n2<256;$n2++){
对于($n3=0;$n3<256;$n3++){
对于($n4=0;$n4<256;$n4++){
回声$n1.“.$n2.“$n3.“$n4.\n”;
}
}       
}
}   

从表面上看,这似乎有点疯狂-你将如何根据生成的地址“验证”地址?嗯……所有IPv4可能都是通过使用4个简单循环生成的,一个接一个,类似于($n1=0;$n1)的
for($n1=0;$n1)从两个循环中选择一个,生成或验证,而不是同时生成。生成所有“有效”(仅仅因为所有的四元组都在0到255之间并不意味着它们在技术上是有效的)IP地址不是验证传入地址的好方法。另外,确定地址的用途,这将消除IP块(127.*和192.*不是有效的internet IP)。我需要生成列表,以检查列表中的地址$randIP=rand(100254)。'.rand(100254)。'.rand(100254)。'.rand(100254)。'.rand(100254)。'.rand(100254);您还需要几个4GB RAM板、几个多核CPU和大量时间来处理两端(服务器和客户端)的地址。我看不出哪里需要大量RAM,我们只使用了4个整数的内存。哦,是的,这确实需要一些时间。@igorw,我们没有4个整数。我们有256^4个IP地址,必须以某种方式存储在某个地方。如果我们将每个地址存储为32位整数,则需要16GB(256*256*256*256*4字节)。如果我们将它们存储为字符串,则需要更多的时间。什么指示这些地址将存储在RAM中?@igorw,什么指示它们不会存储在RAM中?谁知道呢,也许作者修改了PHP源代码,并将数据抛出到
/dev/null
,而不是输出它……或者更好——也许他有一些异类能在1秒内完成比人类数千亿高科技技术更多工作的技术。无论如何,做这样的循环比仅仅是一个“糟糕的想法”更糟糕.@lethalMango,我知道你是来自另一个论坛的MangoMotion吗?@Cold Hawaiian,尽管我曾多次练习和尝试同时成为两个人,但我从未完全做到这一点。因此我坚持使用lethalMango,它一定是其他人:)我会使用
过滤器
使用
过滤器\u验证\u IP
来验证IP地址…它比愚蠢的regexp干净得多。@binaryLV-我刚刚添加了它,还添加了你的名字..如果你想添加它作为一个单独的答案,请让我知道,我会删除它:)@lethalMango,如果我知道作者需要什么,我可能会发布一个答案……不过,我不能真正理解作者想要实现什么。他还说他试图建立一些IP验证工具(第三方?),所以我不确定他是否对过滤有效IP地址的不同方式感兴趣。