perl判断ipv6,ipv4,ip

前些日子做网页时,用js写了个判断ipv6的函数,最近把它改为perl实现,大家可以随便使用
下面这个本程序的功能为判断一个字符串是不是ip,是ipv4还是ipv6:

 

 

程序代码如下:

 

 
 
  1. #本程序的功能为判断一个字符串是不是ip,是ipv4还是ipv6  
  2.  
  3. #  以下是用来将 IPv6 地址表示为文本字符串的三种常规形式:  
  4.  
  5. #冒号十六进制形式  
  6.  
  7. #  这是首选形式 n:n:n:n:n:n:n:n。每个 n 都表示八个 16 位地址元素之一的十六进制值。例如:   
  8.  
  9. #  3FFE:FFFF:7654:FEDA:1245:BA98:3210:4562.  
  10.  
  11. #压缩形式  
  12.  
  13. #  由于地址长度要求,地址包含由零组成的长字符串的情况十分常见。为了简化对这些地址的写入,  
  14.  
  15. # 可以使用压缩形式,在这一压缩形式中,多个 0 块的单个连续序列由双冒号符号 (::) 表示。此符号只能在地址中出现一  
  16.  
  17. #  
  18.  
  19. #次。例如,多路广播地址 FFED:0:0:0:0:BA98:3210:4562 的压缩形式为 FFED::BA98:3210:4562。  
  20.  
  21. #单播地址   
  22.  
  23. #3FFE:FFFF:0:0:8:800:20C4:0 的压缩形式为 3FFE:FFFF::8:800:20C4:0。  
  24.  
  25. #环回地址 0:0:0:0:0:0:0:1 的压缩形式为 ::1。  
  26.  
  27. #未指定的地址 0:0:0:0:0:0:0:0 的压缩形式为 ::。  
  28.  
  29. #混合形式  
  30.  
  31. #  此形式组合 IPv4 和 IPv6 地址。在此情况下,地址格式为 n:n:n:n:n:n:d.d.d.d,  
  32.  
  33. #其中每个 n 都表示六个 IPv6 高序位 16 位地址元素之一的十六进制值,每个 d 都表示 IPv4 地址的十进制值。  
  34.  
  35. #@author yifangyou  
  36.  
  37. #@version gslb 2011-03-23   
  38.  
  39.  
  40. @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");  
  41. for my $ip (@testIP) {  
  42.     my $result=isIP($ip);  
  43.     if($result){  
  44.         print "[$ip] is ipv$result\n";  
  45.     }else{  
  46.         print "[$ip] is not ip\n";  
  47.     }  
  48. }  
  49.  
  50. #计算CDCD:或者:2222的个数  
  51.  
  52. #@author yifangyou  
  53.  
  54. #@version gslb 2011-03-23  
  55.  
  56. #@return 0:表示没有找到,>0表示替换了多少个  
  57.  
  58. sub cLength{  
  59.     my $s= shift;  
  60.   return $s=~ s/([0-9a-f]{1,4}:)|(:[0-9a-f]{1,4})/ /gi;   
  61. }   
  62.  
  63. #判断ipv4格式  
  64.  
  65. #@author yifangyou  
  66.  
  67. #@version gslb 2011-03-23   
  68.  
  69. #@return 0:表示不是ip,4:表示ipv4,6:表示ipv6  
  70.  
  71. sub isIP{  
  72.     my $tmpstr=shift;   
  73.     if(isIPv4($tmpstr)){  
  74.         return 4;  
  75.     }  
  76.     if(isIPv6($tmpstr)){  
  77.         return 6;      
  78.     }  
  79.     return 0;  
  80. }  
  81.  
  82. #判断ipv4格式  
  83.  
  84. #@author yifangyou  
  85.  
  86. #@version gslb 2011-03-23   
  87.  
  88. #@return 0:表示不是ipv4,1:表示ipv4  
  89.  
  90. sub isIPv4  
  91. {  
  92.     my $tmpstr=shift;   
  93.     if(@matches=$tmpstr=~/^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/i)  
  94.   {  
  95.         if($matches[0]<=255 && $matches[1]<=255 &&$matches[2]<=255 && $matches[3]<=255){  
  96.                 return 1;  
  97.             }  
  98.   }  
  99.   return 0;  
  100. }  
  101.  
  102. #判断ipv6格式  
  103.  
  104. #@author yifangyou  
  105.  
  106. #@version gslb 2011-03-23       
  107.  
  108. #@return 0:表示不是ipv6,1:表示ipv6  
  109.  
  110. sub isIPv6  
  111. {  
  112.      my $tmpstr=shift;   
  113.        
  114. #        判断CDCD:910A:2222:5498:8475:1111:3900:2020   
  115.  
  116.     if($tmpstr=~/^([0-9a-f]{1,4}:){7}[0-9a-f]{1,4}$/i){  
  117.         return 1;  
  118.     }  
  119. #        判断::  
  120.  
  121.     if($tmpstr=~/^::$/i){  
  122.             return 1;  
  123.     }  
  124. #        F:F:F::1:1 F:F:F:F:F::1 F::F:F:F:F:1格式   
  125.  
  126.     if($tmpstr=~/^(([0-9a-f]{1,4}:){1,6})((:[0-9a-f]{1,4}){1,6})$/i){  
  127.         my $c=cLength($tmpstr);  
  128.         if($c>0 && $c<=7){  
  129.             return 1;  
  130.         }  
  131.     }  
  132.                           
  133. #        F:F:10F::  
  134.  
  135.     if($tmpstr=~/^([0-9a-f]{1,4}:){1,7}:$/i){  
  136.         return 1;  
  137.     }  
  138.       
  139. #        ::F:F:10F  
  140.  
  141.     if($tmpstr=~/^:(:[0-9a-f]{1,4}){1,7}$/i){  
  142.         return 1;  
  143.     }  
  144.           
  145. #        F:E:E:A:B:C:10.0.0.1格式  
  146.  
  147.         if(@matches=$tmpstr=~/^([0-9a-f]{1,4}:){6}(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){  
  148.         if(isIPv4($matches[1])){  
  149.                 return 1;  
  150.             }  
  151.     }  
  152.  
  153. # F::10.0.0.1格式  
  154.  
  155.         if(@matches=$tmpstr=~/^([0-9a-f]{1,4}:){1,5}:(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){  
  156.         if(isIPv4($matches[1])){  
  157.                 return 1;  
  158.             }  
  159.     }          
  160. #        ::10.0.0.1格式  
  161.  
  162.         if(@matches=$tmpstr=~/^::(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})$/i){  
  163.         if(isIPv4($matches[0])){  
  164.                 return 1;  
  165.             }  
  166.     }  
  167.         return 0;  

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值