写了一个JS函数,判断一段字符串是IPv4,IPv6,或者都不是。
执行效率还是不错的,循环搞定,用了点正则。
我感觉这样的逻辑实现判断,比用纯正则可读性,可维护性要好。
var validIPAddress = function(IP) {
//按"."进行分割
var parts = IP.split(".");
//IPv4由4个部分组成
if(parts.length === 4){
for(var i=0;i<parts.length;i++){
var cur = parts[i];
//空字符串或当前部分不是数字
//那么肯定不合法
if(!cur || isNaN(cur)){
return "Neither";
}
//转化为数字
var num = +cur;
//合法范围应该在0-255之间
if(num < 0 || num > 255){
return "Neither";
}
//排除"172.016.254.01"这样以0开头的不合法情况
if(num + "" !== cur){
return "Neither";
}
}
return "IPv4";
}
//合法的IPv6像这样:
//"2001:0db8:85a3:0000:0000:8a2e:0370:7334"
//以":"来分割
parts = IP.split(":");
//正则验证是否有指定字符以外的字符存在
var reg = /[^0123456789abcdefABCDEF]/;
//IPv6由8个部分组成
if(parts.length === 8){
for(i=0;i<parts.length;i++){
var cur = parts[i];
//如果是空字符串或者当前部分长度超标
if(!cur || cur.length > 4){
return "Neither";
}
//如果包含非法字符
if(reg.test(cur)){
return "Neither";
}
}
return "IPv6";
}
//不是合法的IP地址
return "Neither";
};