前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >js校验ip、子网掩码、网关的合法性

js校验ip、子网掩码、网关的合法性

作者头像
OECOM
发布2020-07-02 09:32:59
5.7K0
发布2020-07-02 09:32:59
举报
文章被收录于专栏:OECOMOECOM

校验IP格式

IP的格式是xxx.xxx.xxx.xxx每个段的最大值为255,故可以采用正则表达式的方式来进行校验

代码语言:javascript
复制
function checkIp(ip){
	var rep = /^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/;
	if(!rep.test(ip)){
		return false;
	}else{
		return true;
	}
}

子网掩码格式

子网掩码(subnet mask)又叫网络掩码、地址掩码、子网络遮罩,它是一种用来指明一个IP地址的哪些位标识的是主机所在的子网,以及哪些位标识的是主机的位掩码。子网掩码不能单独存在,它必须结合IP地址一起使用。子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。单纯的子网掩码有一定的格式规则,通过下面的正则表达式进行校验

代码语言:javascript
复制
 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段子网掩码的四个段做与运算,结果和默认子网掩码类相同即为正确。

代码语言:javascript
复制
//校验子网掩码
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|1\d\d|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|1\d\d|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|1\d\d|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在同一个网段内,否则不在同一个网段内

代码语言:javascript
复制
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|1\d\d|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|1\d\d|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|1\d\d|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则需要分别进行校验

代码语言:javascript
复制
//校验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地址与子网掩码、网关地址不匹配';
		    }
	}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 子网掩码格式
  • 网关规则
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档