0

我需要检查 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 版本检查的最佳、万无一失的方法是什么?

4

2 回答 2

2

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

另外,因为冒号最有可能在第五个位置,从那里开始会更快地返回真实结果,所以使用lastIndexOf可能会稍微高效一些。(尽管在大多数情况下差异很小。)

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

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

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

于 2013-11-03T16:35:14.557 回答
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

于 2013-11-04T01:50:07.223 回答