2013-07-20 40 views
0

我有這樣的代碼檢測的IPv4:如何檢測子網IP?

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; 
} 
  1. 是否檢測到的IPv4子網正確的方式,或者你有更好的想法?如果是,請給我一個例子(代碼)。
  2. 如何檢測ipv6的子網是否可能?
+0

聽起來像你應該問的超級用戶。 –

+0

@AmalMurali,用於什麼?這與編程有關,就像任何程序涉及到它的功能一樣。 – Brad

+0

「detect ipv4 subnet」是什麼意思?子網是網絡的一部分,而不是IP。 IP可能是不同大小的多個網絡的成員。 – duskwuff

回答

3

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_FLAG_IPV4/6作爲第三個參數,以確保所需的格式。