perl判断ipv6,ipv4,ip
2011-07-07 21:32
549 查看
前些日子做网页时,用js写了个判断ipv6的函数,最近把它改为perl实现,大家可以随便使用
。
下面这个本程序的功能为判断一个字符串是不是ip,是ipv4还是ipv6:
程序代码如下:
本文出自 “一方有” 博客,请务必保留此出处http://yifangyou.blog.51cto.com/900206/605760
。
下面这个本程序的功能为判断一个字符串是不是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$result\n"; }else{ print "[$ip] is not ip\n"; } } #计算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})\.(\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,4}:){1,7}:$/i){ return 1; } # ::F:F:10F if($tmpstr=~/^:(:[0-9a-f]{1,4}){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}\.\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,4}:){1,5}:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){ if(isIPv4($matches[1])){ return 1; } } # ::10.0.0.1格式 if(@matches=$tmpstr=~/^::(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){ if(isIPv4($matches[0])){ return 1; } } return 0; }
本文出自 “一方有” 博客,请务必保留此出处http://yifangyou.blog.51cto.com/900206/605760
相关文章推荐
- 判断一个字符串是否是有效IP(包括IPv4和IPv6)
- C#获取本机IP(排除IPV6,仅获取IPV4)的方法--转载
- perl 判断ip是否在某个子网
- ipv6与ipv4的js正则判断
- Returning an IPv4 Address in an IPv6-Enabled Environment 在vista中获取IPV4的IP
- 网络基础――DNS、IP、IPV4、IPV6
- 如何判断当前系统是ipv4还是ipv6
- ipv6与ipv4的正则判断
- IP,IPV4,IPV6
- C#获取本机IP(排除IPV6,仅获取IPV4)的方法
- IP 地址的划分 IPV4 IPV6的配置
- iOS获得当前设备的IP最方便最好的方法 (分IPv4 & IPv6)
- js 判断ipv4 ipv6
- ip过度之ipv6 to ipv4 隧道技术
- JS校验合法IP的正则表达式(包括IPV4和IPV6)
- (0035) iOS 开发之获得当前设备的IP(分IPv4 & IPv6)
- C#,Web系统中如何判断访问来源IP为本地(IPv4)
- c# 机器名和IP取得(IPV4 IPV6)