js 验证 IP、子网掩码、网关的合法性
校验IP格式
IP的格式是xxx.xxx.xxx.xxx每个段的最大值为255,故可以采用正则表达式的方式来进行校验
function checkIp(ip){
var rep = /^(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5]).(d{1,2}|1dd|2[0-4]d|25[0-5])$/;
if(!rep.test(ip)){
return false;
}else{
return true;
}
}
子网掩码格式
子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。单纯的子网掩码有一定的格式规则,通过下面的正则表达式进行校验
var exp=/^(254|252|248|240|224|192|128|0).0.0.0|255.(254|252|248|240|224|192|128|0).0.0|255.255.(254|252|248|240|224|192|128|0).0|255.255.255.(254|252|248|240|224|192|128|0)$/;
如果要结合上ip则需要新的规则,每一类的子网掩码默认码是不同的,在此只说前三类掩码
A类掩码默认为255.0.0.0 B类掩码默认为255.255.0.0 C类掩码默认为255.255.255.0
A类IP地址(所有地址)(点分十进制)范围:0.0.0.0---127.255.255.255 B类IP地址(所有地址)(点分十进制)范围:128.0.0.0---191.255.255.255 C类IP地址(所有地址)(点分十进制)范围:192.0.0.0---223.255.255.255
此类说的分类包含了所有的地址。
当只有一个ip地址的时候,只需要将输入的子网掩码的四个段分别于默认的ip段子网掩码的四个段做与运算,结果和默认子网掩码类相同即为正确。
//校验子网掩码
function checkMask(ip1,mask){
// obj=mask;
//符合规范返回值为0,否则返回2
var exp=/^(254|252|248|240|224|192|128|0).0.0.0|255.(254|252|248|240|224|192|128|0).0.0|255.255.(254|252|248|240|224|192|128|0).0|255.255.255.(254|252|248|240|224|192|128|0)$/;
var A_IP_REGEX_ALL = /^(d|[1-9]d|1[0-1]d|12[0-7])(.(d|[1-9]d|1dd|2[0-4]d|25[0-5])){3}$/;
var B_IP_REGEX_ALL = /^(12[8-9]|1[3-8]d|19[0-1])(.(d|[1-9]d|1dd|2[0-4]d|25[0-5])){3}$/;
var C_IP_REGEX_ALL = /^(19[2-9]|2[0-1]d|22[0-3])((.(d|[1-9]d|1dd|2[0-4]d|25[0-5]))){3}$/;
if(!exp.test(mask)){
return 2;
}else{
var ip1Array = ip1.split(".");
var yuIp1 = new Array();
var mask_arr = mask.split(".");
var checkMask = true;
var checkIpD = 0;
if(A_IP_REGEX_ALL.test(ip1)){
var static_Mask = [255,0,0,0];
yuIp1.push(parseInt(static_Mask[0]) & parseInt(mask_arr[0]));
yuIp1.push(parseInt(static_Mask[1]) & parseInt(mask_arr[1]));
yuIp1.push(parseInt(static_Mask[2]) & parseInt(mask_arr[2]));
yuIp1.push(parseInt(static_Mask[3]) & parseInt(mask_arr[3]));
$.each(yuIp1,function(i,p){
if(p!=static_Mask[i]){
checkMask = false;
return false;
}
});
if(!checkMask){
return 2;
}else{
return 0;
}
}else if(B_IP_REGEX_ALL.test(ip1)){
var static_Mask = [255,255,0,0];
yuIp1.push(parseInt(static_Mask[0]) & parseInt(mask_arr[0]));
yuIp1.push(parseInt(static_Mask[1]) & parseInt(mask_arr[1]));
yuIp1.push(parseInt(static_Mask[2]) & parseInt(mask_arr[2]));
yuIp1.push(parseInt(static_Mask[3]) & parseInt(mask_arr[3]));
$.each(yuIp1,function(i,p){
if(p!=static_Mask[i]){
checkMask = false;
return false;
}
});
if(!checkMask){
return 2;
}else{
return 0;
}
}else if(C_IP_REGEX_ALL.test(ip1)){
var static_Mask = [255,255,255,0];
yuIp1.push(parseInt(static_Mask[0]) & parseInt(mask_arr[0]));
yuIp1.push(parseInt(static_Mask[1]) & parseInt(mask_arr[1]));
yuIp1.push(parseInt(static_Mask[2]) & parseInt(mask_arr[2]));
yuIp1.push(parseInt(static_Mask[3]) & parseInt(mask_arr[3]));
$.each(yuIp1,function(i,p){
if(p!=static_Mask[i]){
checkMask = false;
return false;
}
});
if(!checkMask){
return 2;
}else{
return 0;
}
}
}
}
当有两个ip时需要判断两个ip是否在同一个ip段内,需要再将ip分别于输入的子网掩码做与运算,算出的结果相同,则两个ip在同一个网段内,否则不在同一个网段内
function checkMask(ip1,ip2,mask){
// obj=mask;
//符合规范返回值为0,两个ip不在同一网段则返回1,否则返回2
var exp=/^(254|252|248|240|224|192|128|0).0.0.0|255.(254|252|248|240|224|192|128|0).0.0|255.255.(254|252|248|240|224|192|128|0).0|255.255.255.(254|252|248|240|224|192|128|0)$/;
var A_IP_REGEX_ALL = /^(d|[1-9]d|1[0-1]d|12[0-7])(.(d|[1-9]d|1dd|2[0-4]d|25[0-5])){3}$/;
var B_IP_REGEX_ALL = /^(12[8-9]|1[3-8]d|19[0-1])(.(d|[1-9]d|1dd|2[0-4]d|25[0-5])){3}$/;
var C_IP_REGEX_ALL = /^(19[2-9]|2[0-1]d|22[0-3])((.(d|[1-9]d|1dd|2[0-4]d|25[0-5]))){3}$/;
if(!exp.test(mask)){
return 2;
}else{
var ip1Array = ip1.split(".");
var ip2Array = ip2.split(".");
var yuIp1 = new Array();
var mask_arr = mask.split(".");
var checkMask = true;
var checkIpD = 0;
if(ip1==""||ip2==""){
return 2;
}
var chechIp1s = new Array();
var chechIp2s = new Array();
chechIp1s.push(parseInt(ip1Array[0]) & parseInt(mask_arr[0]));
chechIp1s.push(parseInt(ip1Array[1]) & parseInt(mask_arr[1]));
chechIp1s.push(parseInt(ip1Array[2]) & parseInt(mask_arr[2]));
chechIp1s.push(parseInt(ip1Array[3]) & parseInt(mask_arr[3]));
chechIp2s.push(parseInt(ip2Array[0]) & parseInt(mask_arr[0]));
chechIp2s.push(parseInt(ip2Array[1]) & parseInt(mask_arr[1]));
chechIp2s.push(parseInt(ip2Array[2]) & parseInt(mask_arr[2]));
chechIp2s.push(parseInt(ip2Array[3]) & parseInt(mask_arr[3]));
$.each(chechIp1s,function(i,p){
if(parseInt(p)!=chechIp2s[i]){
//Showbo.Msg.alert("起始IP地址和终止IP地址不在同一网段");
checkIpD = 1;
return false;
}
});
if(checkIpD==1){
return 1;
}
if(A_IP_REGEX_ALL.test(ip1)&&A_IP_REGEX_ALL.test(ip2)){
var static_Mask = [255,0,0,0];
yuIp1.push(parseInt(static_Mask[0]) & parseInt(mask_arr[0]));
yuIp1.push(parseInt(static_Mask[1]) & parseInt(mask_arr[1]));
yuIp1.push(parseInt(static_Mask[2]) & parseInt(mask_arr[2]));
yuIp1.push(parseInt(static_Mask[3]) & parseInt(mask_arr[3]));
$.each(yuIp1,function(i,p){
if(p!=static_Mask[i]){
checkMask = false;
return false;
}
});
if(!checkMask){
return 2;
}else{
return 0;
}
}else if(B_IP_REGEX_ALL.test(ip1)&&B_IP_REGEX_ALL.test(ip2)){
var static_Mask = [255,255,0,0];
yuIp1.push(parseInt(static_Mask[0]) & parseInt(mask_arr[0]));
yuIp1.push(parseInt(static_Mask[1]) & parseInt(mask_arr[1]));
yuIp1.push(parseInt(static_Mask[2]) & parseInt(mask_arr[2]));
yuIp1.push(parseInt(static_Mask[3]) & parseInt(mask_arr[3]));
$.each(yuIp1,function(i,p){
if(p!=static_Mask[i]){
checkMask = false;
return false;
}
});
if(!checkMask){
return 2;
}else{
return 0;
}
}else if(C_IP_REGEX_ALL.test(ip1)&&C_IP_REGEX_ALL.test(ip2)){
var static_Mask = [255,255,255,0];
yuIp1.push(parseInt(static_Mask[0]) & parseInt(mask_arr[0]));
yuIp1.push(parseInt(static_Mask[1]) & parseInt(mask_arr[1]));
yuIp1.push(parseInt(static_Mask[2]) & parseInt(mask_arr[2]));
yuIp1.push(parseInt(static_Mask[3]) & parseInt(mask_arr[3]));
$.each(yuIp1,function(i,p){
if(p!=static_Mask[i]){
checkMask = false;
return false;
}
});
if(!checkMask){
return 2;
}else{
return 0;
}
}
}
}
网关规则
加入网关之后,则需要校验ip,子网掩码,网关三者的合法性,需要先确定前面的校验通过,在进行网关的校验,网关的校验规则为ip于子网掩码做与运算,网关于子网掩码做与运算,所得出的结果相同则为符合规范。如果有两个ip则需要分别进行校验
//校验ip、子网掩码、网关的合法性
function checkNet(static_ip,static_mask,static_gw){
if(static_ip == static_mask || static_mask == static_gw || static_mask == static_gw)
{
return "IP地址与子网掩码、网关地址不能相同"; //3个地址不能相同
}
var static_ip_arr = new Array;
var static_mask_arr = new Array;
var static_gw_arr = new Array;
static_ip_arr = static_ip.split(".");
static_mask_arr = static_mask.split(".");
static_gw_arr = static_gw.split(".");
var res0 = parseInt(static_ip_arr[0]) & parseInt(static_mask_arr[0]);
var res1 = parseInt(static_ip_arr[1]) & parseInt(static_mask_arr[1]);
var res2 = parseInt(static_ip_arr[2]) & parseInt(static_mask_arr[2]);
var res3 = parseInt(static_ip_arr[3]) & parseInt(static_mask_arr[3]);
var res0_gw = parseInt(static_gw_arr[0]) & parseInt(static_mask_arr[0]);
var res1_gw = parseInt(static_gw_arr[1]) & parseInt(static_mask_arr[1]);
var res2_gw = parseInt(static_gw_arr[2]) & parseInt(static_mask_arr[2]);
var res3_gw = parseInt(static_gw_arr[3]) & parseInt(static_mask_arr[3]);
if(res0==res0_gw && res1==res1_gw && res2==res2_gw && res3==res3_gw)
{
return "";
}else{
return 'IP地址与子网掩码、网关地址不匹配';
}
}