2013-11-03 207 views
0

我需要檢查IP地址是IPv4還是IPv6,以便相應地操作IP地址。檢查IP地址類型,IPv4或IPv6

這可以通過一些簡單的實現,說

<cfset ip = "2a01:bc80:1::"> 
<cfif ip does not contain ":"> 
<cfset ipV="IPv4"> 
<cfelse> 
<cfset ipV="IPv6"> 

但在另一方面,不認爲這是解決這個問題的辦法萬無一失。 我也嘗試用正則表達式重寫php例子,但無法將其整理出來。

<cfset ip = "24.225.236.0"> 
<cfset checkIp = ReMatch("^[0-9a-f]{1,4}:([0-9a-f]{0,4}:){1,6}[0-9a-f]{1,4}$/", trim(ip))> 

<cfif checkIp neq 0> 
<cfset ipV="IPv4"> 
<cfelse> 
<cfset ipV="IPv6"> 
</cfif> 

<cfdump var="#ipV#"> 

什麼是最好的,萬無一失的方式來處理ip版本檢查?

+0

爲什麼檢查並非萬無一失冒號?如果你知道你有一個IP地址,這似乎很好?你有沒有冒號的IPv6地址? –

+0

我將使用CGI.REMOTE_ADDR來獲取用戶的IP,因此每次都應該將正確的IP傳遞給代碼。也許我應該添加一些代碼來檢查IP是否有效!? – user2595617

+0

我認爲IPv6總是至少有一個: – user2595617

回答

2

如果IPv6必須有一個冒號,直接包含檢查的唯一小改進是不檢查過去的第五個字符,因爲這些段不超過四個十六進制字符?

另外,由於冒號最有可能位於第五位,因此從那裏開始會更快地返回真實結果,因此使用lastIndexOf可能會稍微更有效。 (雖然差異在大多數情況下,是微不足道的。)

<cfset IpV = (ip.lastIndexOf(':',4) GTE 0) ? 'IPv6' : 'IPv4' /> 

四是因爲它是一個Java方法,這就是指第五個字符的0索引的方式。如果不匹配,則返回-1,因此GTE 0部分。

其他改進與事物的IP檢查方面無關,但是是三元條件運算符... Variable = BooleanCondition ? ValueIfTrue : ValueIfFalse對於這樣的簡單條件賦值更好。

0

我會做一個isIPv4()UDF,以便在執行檢查後不必比較結果。這可能是一樣容易:

<cfscript> 
function isIPv4(ip){ 
    return listlen(ip,".") EQ 4; 
} 
</cfscript> 

然後所有你需要做的是:

<CFIF isIPv4(IPAddressToTest)> 
    This is IPv4 
<CFELSE> 
    This is not IPv4 
</CFIF> 

這裏是一個ColdFusion 5兼容UDF檢查,看看是否每個字節是有效的。 (這是一個好地方,檢查。):

http://cflib.org/udf/IsIP