2010-06-14 217 views
4

我正在使用瀏覽時遇到的IP驗證功能,它一直運行良好,直到今天我遇到了問題。IP地址驗證幫助

出於某種原因,該功能將無法驗證此IP爲有效:203.81.192.26

我不使用正則表達式太大,所以希望得到什麼可能是錯誤的任何幫助。

如果您有其他的功能,我將不勝感激,如果你能後,對我的。

該函數的代碼如下:

public static function validateIpAddress($ip_addr) 
{ 
    global $errors; 

    $preg = '#^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}' . 
      '(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$#'; 

    if(preg_match($preg, $ip_addr)) 
    { 
     //now all the intger values are separated 
     $parts = explode(".", $ip_addr); 

     //now we need to check each part can range from 0-255 
     foreach($parts as $ip_parts) 
     { 
      if(intval($ip_parts) > 255 || intval($ip_parts) < 0) 
      { 
       $errors[] = "ip address is not valid."; 
       return false; 
      } 

      return true; 
     } 

     return true; 
    } else { 
     $errors[] = "please double check the ip address."; 
     return false; 
    } 
} 

回答

1

那麼,你爲什麼要做正則表達式和整數比較?你是「雙重」檢查地址。另外,你的第二個檢查是無效的,因爲如果第一個八位字節是有效的(你在foreach循環中返回真),它總是會返回true。

你可以這樣做:

$parts = explode('.', $ip_addr); 
if (count($parts) == 4) { 
    foreach ($parts as $part) { 
     if ($part > 255 || $part < 0) { 
      //error 
     } 
    } 
    return true; 
} else { 
    return false; 
} 

但正如其他人所說,ip2long/long2ip可滿足您的需求更好地...

+0

感謝您對循環捕捉那些回報百萬:○這是我好笨:(我沒有注意到,直到你指出了這一點:○ 我改變了功能來匹配你的,現在它開始驗證該地址:) 我也會在稍後嘗試ip2long/long2ip方法。 再次感謝 – Zubair1 2010-06-15 05:27:25

+0

-1,與ipv6不兼容 – rook 2012-11-07 04:55:46

8

我更喜歡簡單的方法描述here。出於安全目的,這應該被認爲是有效的。雖然請確保你從$_SERVER['REMOTE_ADDR']得到它,但任何其他http頭都可能被欺騙。

function validateIpAddress($ip){ 
    return long2ip(ip2long($ip)))==$ip; 
} 
+0

Yipee!這也爲我工作:) 謝謝:) – Zubair1 2010-06-15 05:28:38