检查IP地址类型,IPv4或IPv6

时间:2013-11-03 15:24:46

标签: regex coldfusion ip coldfusion-10

我需要检查IP地址是IPv4还是IPv6,以便相应地操作。

这可以用简单的东西来实现,比如说

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

另一方面,不要认为这是解决这个问题的万无一失的方法。 我也尝试用regex重写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版本检查的最佳,最简单的方法是什么?

2 个答案:

答案 0 :(得分:2)

如果IPv6必须有一个冒号,那么直接包含检查的唯一小改进是不打扰检查超过第五个字符,因为这些段不超过四个十六进制字符?

此外,因为冒号最有可能位于第五个位置,所以从那里开始会更快地返回真实结果,因此使用lastIndexOf可能会稍微提高效率。 (虽然差异在大多数情况下都是微不足道的。)

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

4是因为它是一个Java方法,这是引用第五个字符的0索引方式。如果没有匹配,则返回-1,因此GTE 0部分。

另一个改进与IP检查方面无关,但是三元条件运算符... Variable = BooleanCondition ? ValueIfTrue : ValueIfFalse对于像这样的简单条件赋值更好。

答案 1 :(得分: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