Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/242.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何检测子网IP?_Php - Fatal编程技术网

Php 如何检测子网IP?

Php 如何检测子网IP?,php,Php,我有以下用于检测ipv4的代码: public static function isSubnet($ip = NULL) { $remoteAddr = (!isset($_SERVER['HTTP_X_FORWARDED_FOR']) && isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : NULL); $ip = strToLower(is_null($ip) ? $remoteAddr :

我有以下用于检测ipv4的代码:

public static function isSubnet($ip = NULL)
{
    $remoteAddr = (!isset($_SERVER['HTTP_X_FORWARDED_FOR']) && isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : NULL);
    $ip = strToLower(is_null($ip) ? $remoteAddr : $ip);

    $part = explode('.', $ip);
    // 10.0.0.0/8   Private network
    // 127.0.0.0/8  Loopback
    // 169.254.0.0/16 & ::1  Link-Local
    // 172.16.0.0/12  Private network
    // 192.168.0.0/16  Private network
    if (count($part) === 4 && ($part[0] === '10' || $part[0] === '127' || ($part[0] === '172' && $part[1] < 16 && $part[1] > 31)
        || ($part[0] === '169' && $part[1] === '254') || ($part[0] === '192' && $part[1] === '168'))
    ) {

        return TRUE;

    }

    return FALSE;
}
公共静态函数isSubnet($ip=NULL)
{
$remoteAddr=(!isset($服务器['HTTP\u X\u转发给'])和&isset($服务器['REMOTE\u ADDR'])?$服务器['REMOTE\u ADDR']:NULL);
$ip=strToLower(为空($ip)?$remoteAddr:$ip);
$part=爆炸('.',$ip);
//10.0.0.0/8专用网络
//127.0.0.0/8环回
//169.254.0.0/16&::1本地链接
//172.16.0.0/12专用网络
//192.168.0.0/16专用网络
如果(计数($part)==4&&($part[0]=='10'| |$part[0]=='127'| |($part[0]=='172'&&&$part[1]<16&$part[1]>31)
||($part[0]=='169'和&$part[1]=='254')| |($part[0]=='192'和&$part[1]=='168'))
) {
返回TRUE;
}
返回FALSE;
}
  • 这是检测ipv4子网的正确方法,还是您对此有更好的想法?如果是,请给我一个例子(代码)
  • 如果可能,如何检测ipv6的子网

  • PHP有内置机制来验证一些常见类型,对于您的情况,它将是:

    $isIP = filter_var($ip, FILTER_VALIDATE_IP);
    
    $isSubnet = !filter_var($ip, FILTER_VALIDATE_IP, 
        FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
    );
    
    return $isIP && $isSubnet;
    

    您可以在第一次检查中使用
    FILTER\u FLAG\u IPV4/6
    作为第三个参数,以确保所需的格式。

    PHP具有bulit-in机制来验证一些常见类型,对于您的情况,它将是:

    $isIP = filter_var($ip, FILTER_VALIDATE_IP);
    
    $isSubnet = !filter_var($ip, FILTER_VALIDATE_IP, 
        FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE
    );
    
    return $isIP && $isSubnet;
    

    您可以在第一次检查中使用
    FILTER\u FLAG\u IPV4/6
    作为第三个参数,以确保所需的格式。

    听起来像是您应该向超级用户询问的问题。@AmalMurali,为什么?这与编程有关,就像任何程序都与它的功能有关一样。您所说的“检测ipv4子网”是什么意思?子网是网络的一部分,而不是IP。一个IP可能是多个不同大小网络的成员。dev-null-allender:给我一个正确的答案。听起来你应该问超级用户。@AmalMurali,为什么?这与编程有关,就像任何程序都与它的功能有关一样。您所说的“检测ipv4子网”是什么意思?子网是网络的一部分,而不是IP。一个IP可能是多个不同大小网络的成员。dev-null-alliner:给我一个正确的答案。