我需要检查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版本检查的最佳,最简单的方法是什么?
答案 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,它检查每个八位字节是否有效。 (这是一个值得检查的好地方。):