2013-03-28 99 views
3

我一直在閱讀如何確定一個IP是IPv4還是IPv6,看起來很明顯,要查找的是否是冒號。但是,您具有IPv4映射的IPv6地址和IPv4兼容的IPv6地址。在我看來,這些類型的地址有兩個冒號和點,所以不是解決方案,尋找是否有沒有::ffff在字符串的開頭,爲什麼不這樣做:IPV4與IPV6 PHP函數

function isIPv6($ip) { 
    if(strpos($ip, ":") !== false && strpos($ip, ".") === false) { 
    return true; 
    } 
    return false; 
} 

編輯:AM我錯過了一些東西,或者這個功能在所有情況下都能正常工作?

+0

這是個問題嗎?你似乎提供了一種檢測IPv6的功能。 – Raptor 2013-03-28 06:14:42

+0

可以看一下IP的長度嗎? – Class 2013-03-28 06:15:40

+2

或者你可以讓自己變得簡單,並且使用['FILTER_FLAG_IPV4'或'FILTER_FLAG_IPV6'和'filter_var()'](http://php.net/manual/en/function.filter-var.php)。 – 2013-03-28 06:15:47

回答

3

IBM

An IPv6 address can have two formats: 

    Normal - Pure IPv6 format 
    2001 : db8: 3333 : 4444 : 5555 : 6666 : 7777 : 8888 
    Dual - IPv6 plus IPv4 formats 
    2001 : db8: 3333 : 4444 : 5555 : 6666 : 1 . 2 . 3 . 4 

您只能驗證IPv6的純格式。 我也建議使用FILTER_FLAG_IPV4 or FILTER_FLAG_IPV6

function isIPv6($ip) { 
    if(strpos($ip, ":") !== false && strpos($ip, ".") === false) { 
    return true; //Pure format 
    } 
    elseif(strpos($ip, ":") !== false && strpos($ip, ".") !== false){ 
    return true; //dual format 
    } 
    else{ 
    return false; 
    } 
} 
+0

技術上,雙IPv6只是半IPv6格式的IPv4嗎? – 2013-03-28 15:22:58

+0

函數中的邏輯基本上是'return strpos($ ip,':')!== false;':) – 2013-04-15 03:18:43

5

PHP => 5.2具有 「內置」 的方式做到這一點使用filter_var

你的函數看起來是這樣的:

function isIPv6($ip) { 

    if(filter_var($ip, FILTER_VALIDATE_IP)) { 

     if(filter_var($ip, FILTER_FLAG_IPV6)) { 
      //It is IPv6 indeed. 
     } else { 
      //It is IPv4 
     } 

    } else { 
     // NOT VALID IP 
    } 

} 
+1

雖然我提供的功能有什麼問題? – 2013-03-28 06:23:13

+2

問題在於'12:29 AM'實際上會返回true。您的評估過於簡單。如果你想實現它自己,那麼你應該考慮使用正則表達式來實現它。 – Ares 2013-03-28 06:30:31

+1

那麼,假設這個函數只用於任何輸入。此功能旨在與有效的IP地址一起使用。我們已經假定輸入是IPv4 IP或IPv6 IP。並非每個功能都需要對所有內容進行超級驗證,以確保輸入有效。使用函數的程序員也需要有一些常識... – 2013-03-28 06:38:10

1

假設IP地址是有效的,知道你可以映射到IPv6的IPv4地址,例如::ffff:127.0.0.1,只要檢查:的存在就夠了。

function isIPv6($address) 
{ 
    return strpos($address, ':') !== false; 
} 

如果可能是無效的,你應該先驗證它:

function isIPv6($address) 
{ 
    return filter_var($address, FILTER_VALIDATE_IP) && 
     strpos($address, ':') !== false; 
} 

順便說一句,這是PHP如何處理IPv6的爲好,因爲你可以看到the source