天天看点

perl判断ipv6,ipv4,ip

前些日子做网页时,用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$result\n";  

    }else{  

        print "[$ip] is not ip\n";  

    }  

}  

#计算CDCD:或者:2222的个数  

#@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格式  

#@return 0:表示不是ip,4:表示ipv4,6:表示ipv6  

sub isIP{  

    my $tmpstr=shift;   

    if(isIPv4($tmpstr)){  

        return 4;  

    if(isIPv6($tmpstr)){  

        return 6;      

    return 0;  

#@return 0:表示不是ipv4,1:表示ipv4  

sub isIPv4  

{  

    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格式  

#@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){  

        }  

#        F:F:10F::  

    if($tmpstr=~/^([0-9a-f]{1,4}:){1,7}:$/i){  

#        ::F:F:10F  

    if($tmpstr=~/^:(:[0-9a-f]{1,4}){1,7}$/i){  

#        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])){  

# 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){  

    }          

#        ::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 0;  

     本文转自yifangyou 51CTO博客,原文链接:http://blog.51cto.com/yifangyou/605760,如需转载请自行联系原作者

继续阅读