前些日子做网页时,用js写了个判断ipv6的函数,最近把它改为perl实现,大家可以随便使用

。
下面这个本程序的功能为判断一个字符串是不是ip,是ipv4还是ipv6:
?

?
程序代码如下:
?
- #本程序的功能为判断一个字符串是不是ip,是ipv4还是ipv6 ?
- ?
- # 以下是用来将?IPv6?地址表示为文本字符串的三种常规形式: ?
- ?
- #冒号十六进制形式 ?
- ?
- # 这是首选形式?n:n:n:n:n:n:n:n。每个?n?都表示八个?16?位地址元素之一的十六进制值。例如:? ?
- ?
- # 3FFE:FFFF:7654:FEDA:1245:BA98:3210:4562. ?
- ?
- #压缩形式 ?
- ?
- # 由于地址长度要求,地址包含由零组成的长字符串的情况十分常见。为了简化对这些地址的写入, ?
- ?
- #?可以使用压缩形式,在这一压缩形式中,多个?0?块的单个连续序列由双冒号符号?(::)?表示。此符号只能在地址中出现一 ?
- ?
- # ?
- ?
- #次。例如,多路广播地址?FFED:0:0:0:0:BA98:3210:4562?的压缩形式为?FFED::BA98:3210:4562。 ?
- ?
- #单播地址? ?
- ?
- #3FFE:FFFF:0:0:8:800:20C4:0?的压缩形式为?3FFE:FFFF::8:800:20C4:0。 ?
- ?
- #环回地址?0:0:0:0:0:0:0:1?的压缩形式为?::1。 ?
- ?
- #未指定的地址?0:0:0:0:0:0:0:0?的压缩形式为?::。 ?
- ?
- #混合形式 ?
- ?
- # 此形式组合?IPv4?和?IPv6?地址。在此情况下,地址格式为?n:n:n:n:n:n:d.d.d.d, ?
- ?
- #其中每个?n?都表示六个?IPv6?高序位?16?位地址元素之一的十六进制值,每个?d?都表示?IPv4?地址的十进制值。 ?
- ?
- #@author?yifangyou ?
- ?
- #@version?gslb?2011-03-23? ?
- ?
- ?
-
@testIP=("1.1.1.1","255.255.255.255","1.-2.3.4","a.b.c.d","CDCD:910A:2222:5498:8475:1111:3900:2020","::","::g","F:F:F::1:1","F:F:10F::","::F:F:10F","F:E:E:A:B:C:10.0.0.1","F:E:E:A:B:C:10.0.a.1","F::10.0.0.1","F:::10.0.0.1","::10.0.0.1"); ?
-
for?my?$ip?(@testIP)?{ ?
- ????my?$result=isIP($ip); ?
- ????if($result){ ?
-
????????print?"[$ip]?is?ipv$resultn"; ?
-
????}else{ ?
-
????????print?"[$ip]?is?not?ipn"; ?
- ????} ?
- } ?
- ?
- #计算CDCD:或者:2222的个数 ?
- ?
- #@author?yifangyou ?
- ?
- #@version?gslb?2011-03-23 ?
- ?
-
#@return?0:表示没有找到,>0表示替换了多少个 ?
- ?
- sub?cLength{ ?
- ????my?$s=?shift; ?
-
??return?$s=~?s/([0-9a-f]{1,4}:)|(:[0-9a-f]{1,4})/?/gi;? ?
- }? ?
- ?
- #判断ipv4格式 ?
- ?
- #@author?yifangyou ?
- ?
- #@version?gslb?2011-03-23? ?
- ?
-
#@return?0:表示不是ip,4:表示ipv4,6:表示ipv6 ?
- ?
- sub?isIP{ ?
- ????my?$tmpstr=shift;? ?
- ????if(isIPv4($tmpstr)){ ?
-
????????return?4; ?
- ????} ?
- ????if(isIPv6($tmpstr)){ ?
-
????????return?6;???? ?
- ????} ?
-
????return?0; ?
- } ?
- ?
- #判断ipv4格式 ?
- ?
- #@author?yifangyou ?
- ?
- #@version?gslb?2011-03-23? ?
- ?
-
#@return?0:表示不是ipv4,1:表示ipv4 ?
- ?
- sub?isIPv4 ?
- { ?
- ????my?$tmpstr=shift;? ?
- ????if(@matches=$tmpstr=~/^(d{1,3}).(d{1,3})$/i) ?
- ??{ ?
- ????????if($matches[0]<=255?&&?$matches[1]<=255?&&$matches[2]<=255?&&?$matches[3]<=255){ ?
-
????????????????return?1; ?
- ????????????} ?
- ??} ?
-
??return?0; ?
- } ?
- ?
- #判断ipv6格式 ?
- ?
- #@author?yifangyou ?
- ?
- #@version?gslb?2011-03-23????? ?
- ?
-
#@return?0:表示不是ipv6,1:表示ipv6 ?
- ?
- sub?isIPv6 ?
- { ?
- ?????my?$tmpstr=shift;? ?
- ????? ?
- #????????判断CDCD:910A:2222:5498:8475:1111:3900:2020? ?
- ?
- ????if($tmpstr=~/^([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}$/i){ ?
-
????????return?1; ?
- ????} ?
- #????????判断:: ?
- ?
- ????if($tmpstr=~/^::$/i){ ?
-
????????????return?1; ?
- ????} ?
- #????????F:F:F::1:1?F:F:F:F:F::1?F::F:F:F:F:1格式? ?
- ?
- ????if($tmpstr=~/^(([0-9a-f]{1,4}:){1,6})((:[0-9a-f]{1,4}){1,6})$/i){ ?
- ????????my?$c=cLength($tmpstr); ?
- ????????if($c>0?&&?$c<=7){ ?
-
????????????return?1; ?
- ????????} ?
- ????} ?
- ???????????????????????? ?
- #????????F:F:10F:: ?
- ?
- ????if($tmpstr=~/^([0-9a-f]{1,7}:$/i){ ?
-
????????return?1; ?
- ????} ?
- ???? ?
- #????????::F:F:10F ?
- ?
- ????if($tmpstr=~/^:(:[0-9a-f]{1,7}$/i){ ?
-
????????return?1; ?
- ????} ?
- ???????? ?
- #????????F:E:E:A:B:C:10.0.0.1格式 ?
- ?
- ????????if(@matches=$tmpstr=~/^([0-9a-f]{1,4}:){6}(d{1,3}.d{1,3})$/i){ ?
- ????????if(isIPv4($matches[1])){ ?
-
????????????????return?1; ?
- ????????????} ?
- ????} ?
- ?
- #?F::10.0.0.1格式 ?
- ?
- ????????if(@matches=$tmpstr=~/^([0-9a-f]{1,5}:(d{1,3})$/i){ ?
- ????????if(isIPv4($matches[1])){ ?
-
????????????????return?1; ?
- ????????????} ?
- ????}???????? ?
- #????????::10.0.0.1格式 ?
- ?
- ????????if(@matches=$tmpstr=~/^::(d{1,3})$/i){ ?
- ????????if(isIPv4($matches[0])){ ?
-
????????????????return?1; ?
- ????????????} ?
- ????} ?
-
????????return?0; ?
- }?