IP地址检测工具
/* 名字:input.js 功能:input类型通用JS 包括: -------------------------------------------------------------------------------------------- 1--IP相关检测及转换函数 1>-isIP 检测IP是否合法 2>-isMask 检测掩码是否合法 3>-IPatol IP字符串转为long 4>-isIPMaskMatch IP与掩码是否匹配 5>-isNet 是否是子网地址 6>-isNetMaskMatch 子网与掩码是否匹配 7>-isIPConflict检测两IP/掩码网段冲突 8>-isNetConflict 检测两子网网段是否冲突 8>-isIPRangeVal检测IP范围是有效 10>isIPRangeConflict检测两IP范围是否互相包含 2--端口相关检测及转换函数 1>-isPort 检测端口是否合法 2>-isPortRangeConflict 检测两端口范围是否冲突 3>-isPortRangeVal 检测端口范围是否有效 3--字符串相关 1>-strlen 字符串长度(返回字符串所占字节数) --------------------------------------------------------------------------------------------------- */ /******************************************************************* **IP相关 ********************************************************************/ //将字符串形式的IP转换成long function IPatol(strIP) { var ip=0; var array=strIP.split("."); if(array.length == 4) { ip=parseInt(ip)+parseInt(array[0])*16777216; ip=parseInt(ip)+parseInt(array[1])*65536; ip=parseInt(ip)+parseInt(array[2])*256; ip=parseInt(ip)+parseInt(array[3]); } return parseInt(ip); } //IP是否合法,无提示,0.0.0.0被认为是不合法IP,如果IP可为0.0.0.0需在外部另加判断 function IPntoa(dwIP) { var part1 = (dwIP>>24) & 0x000000FF; var part2 = (dwIP>>16) & 0x000000FF; var part3 = (dwIP>>8) & 0x000000FF; var part4 = (dwIP & 0x000000FF); return (part1.toString() + "." + part2.toString() + "." + part3.toString() + "." + part4.toString()); } function isIP(strIP) { var re=/^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/; //IP正则 if(re.test( strIP )) { var n1 = parseInt(RegExp.$1); var n2 = parseInt(RegExp.$2); var n3 = parseInt(RegExp.$3); var n4 = parseInt(RegExp.$4); var array = strIP.split("."); if ((array[0].charAt(0) == '0' && n1 != 0) || (array[1].charAt(0) == '0' && n2 != 0) || (array[2].charAt(0) == '0' && n3 != 0) || (array[3].charAt(0) == '0' && n4 != 0)) return false; //首位必需为1-223之间除127之外的任一数字,末位不能为0或255 if((n1>0 && n1<224 && n1!=127) && (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && ( n4>0 && n4<255)) { return true; } } return false; } //IP是否合法,无提示,0.0.0.0被认为是不合法IP,如果IP可为0.0.0.0需在外部另加判断 function isIP2(strIP) { var re=/^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/; //IP正则 if(re.test( strIP )) { var n1 = parseInt(RegExp.$1); var n2 = parseInt(RegExp.$2); var n3 = parseInt(RegExp.$3); var n4 = parseInt(RegExp.$4); var array = strIP.split("."); if ((array[0].charAt(0) == '0' && n1 != 0) || (array[1].charAt(0) == '0' && n2 != 0) || (array[2].charAt(0) == '0' && n3 != 0) || (array[3].charAt(0) == '0' && n4 != 0)) return false; //首位必需为1-223之间除127之外的任一数字,末位不能为0或255 if((n1>=0 && n1<=255) && (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && (n4>=0 && n4<=255)) { return true; } } return false; } //IP验证,有提示 function isIP_t(strIP) { if(strIP == "") { alert("请输入IP!"); this.focus(); return false; } if(!isIP(strIP)) { alert("IP无效! (只能包含0-255之间的整数, 且首位必须是1-223之间除127以外的数字, 末位不能为0或255)"); this.focus(); return false; } return true; } //掩码是否合法,无提示 function isMask(strMask) { //var reg=/^(d{1,2}|1dd|2[0-4]d|25[0-5])(.(d{1,2}|1dd|2[0-4]d|25[0-5])){3}$/; //IP正则 var reg=/^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/;//IP正则 if(reg.test(strMask)) { var n1 = parseInt(RegExp.$1); var n2 = parseInt(RegExp.$2); var n3 = parseInt(RegExp.$3); var n4 = parseInt(RegExp.$4); if(isNaN(n1) || isNaN(n2) || isNaN(n3) || isNaN(n4)) { return false; } if( (n1>255 || n1<0)|| (n2>255 || n2<0) || (n3>255 || n3<0) || (n4>255 || n4<0)) { return false; } var tmp = (n1*Math.pow(2,24))+(n2*Math.pow(2,16))+(n3*Math.pow(2,8))+n4; if(tmp < Math.pow(2,31)) { return false; } else { tmp -= Math.pow(2,31); //后续位必须为连续的1 for (i = 30; i > 1; i --) { if (tmp == 0) { break; } else if(tmp < Math.pow(2,i)) { return false; } else { tmp -= Math.pow(2,i); } } } } else//!reg.match( strMask) { return false; } return true; } //掩码是否合法,0.0.0.0是合法的 function isMask2(strMask) { if(!isMask(strMask)) { if(strMask == "0.0.0.0") { return true; } else return false; } else return true; } //子网掩码验证,有提示 function isMask_t(strMask) { if(strMask == "") { alert("请输入掩码!"); return false; } if(!isMask(strMask)) { alert("请输入有效的子网掩码!"); return false; } return true; } //IP与掩码匹配验证,在执行此函数前,需已对IP及掩码的有效性做过检验 function isIPMaskMatch(strIP, strMask) { var nIP = IPatol(strIP); var nMask = IPatol(strMask); if (((nIP|nMask)== -1) || (((nIP|nMask)+Math.pow(2,32)) == nMask)) { return false; } return true; } //验证是否是合法的子网地址,0.0.0.0认为是不合法 function isNet(strNet) { var re=/^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/; //IP正则 if(re.test( strNet )) { var n1 = parseInt(RegExp.$1); var n2 = parseInt(RegExp.$2); var n3 = parseInt(RegExp.$3); var n4 = parseInt(RegExp.$4); //首位为1-223之间除127以外的数字 if( (n1>0 && n1<224 && n1!=127)&& (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && (n4>=0 && n4<=255)) { return true; } } return false; } //验证是否是合法的子网地址,0.0.0.0认为是合法 function isNet2(strNet) { var re=/^(d{1,3}).(d{1,3}).(d{1,3}).(d{1,3})$/; //IP正则 if(re.test( strNet )) { var n1 = parseInt(RegExp.$1); var n2 = parseInt(RegExp.$2); var n3 = parseInt(RegExp.$3); var n4 = parseInt(RegExp.$4); //首位为1-223之间除127以外的数字 if( (n1>=0 && n1<224 && n1!=127)&& (n2>=0 && n2<=255) && (n3>=0 && n3<=255) && (n4>=0 && n4<=255)) { return true; } } return false; } //验证子网与掩码的匹配,在执行此函数之前,需对子网及掩码的有效性做验证 function isNetMaskMatch(strNet,strMask) { var tmpArray=strNet.split("."); var tmpArray2 = strMask.split("."); if(tmpArray.length != 4 || tmpArray2.length != 4) { return false; } for (i = 0; i < 4; i++) { tmpArray[i] = parseInt(tmpArray[i]); tmpArray2[i] = parseInt(tmpArray2[i]); if ((tmpArray[i]|tmpArray2[i])!=tmpArray2[i]) { return false; } } return true; } //验证两IP/掩码 网段是否冲突,在调用该函数前,需已检测传入参数的有效性 //true -- 冲突,false -- 未冲突 function isIPConflict( strIP1,strMask1, strIP2, strMask2) { var ip1 = IPatol(strIP1); var mask1 = IPatol(strMask1); var ip2 = IPatol(strIP2); var mask2 = IPatol(strMask2); if(ip1 == 0 || mask1 == 0 || ip2 == 0 || mask2 == 0) { return false; } if( (ip1&mask1&mask2) == (ip2&mask2&mask1)) { return true; //网段冲突 } return false; } //验证两子网网段是否冲突(具有包含关系),在调用该函数前,需已检测传入参数的有效性 //true -- 冲突,false -- 未冲突 function isNetConflict( strNet1,strMask1,strNet2,strMask2) { var net1 = IPatol(strNet1); var mask1 = IPatol(strMask1); var net2 = IPatol(strNet2); var mask2 = IPatol(strMask2); if(net1 == 0 || mask1 == 0 || net2 == 0 || mask2 == 0) { return false; } //冲突 if( (net1&mask2) == (net2&mask1)) { return true; } return false; } //验证IP范围是否有效(起始IP不能大于结束IP) function isIPRangeVal(strIPFrom,strIPTo) { var ip1 = IPatol(strIPFrom); var ip2 = IPatol(strIPTo); if(ip1>ip2) { return false; //起始IP大于结束IP } return true; } //验证IP范围冲突(即是否具有包含关系),传入参数的有效性在调用该函数前已验证 function isIPRangeConflict(IPFrom1,IPTo1,IPFrom2,IPTo2) { var ipf1 = IPatol(IPFrom1); var ipt1 = IPatol(IPTo1); var ipf2 = IPatol(IPFrom2); var ipt2 = IPatol(IPTo2); if(!((ipf1>ipt2) || (ipt1<ipf2))) { return true; //IP范围具有包含关系 } return false; } /******************************************************************** **端口相关 *********************************************************************/ //是否是有效的端口 function isPort(strPort) { var nport = parseInt(strPort); if(isNaN(nport)||nport<1 ||nport>65535) { return false; //不是1-65535之间的数 } return true; } //是否是有效的端口范围 function isPortRangeVal(strPort1,strPort2) { var nport1 = parseInt(strPort1); var nport2 = parseInt(strPort2); if(isNaN(nport1) || isNaN(nport2)) { return false; } if(nport1>nport2) { return false; //起始端口大于结束端口 } return true; } //端口范围是否冲突 function isPortRangeConflict(PortF1,PortT1,PortF2,PortT2) { var nf1 = parseInt(PortF1); var nt1 = parseInt(PortT1); var nf2 = parseInt(PortF2); var nt2 = parseInt(PortT2); if(isNaN(nf1) || isNaN(nt1) || isNaN(nf2) || isNaN(nt2)) { return false; } if( !( (nf1>nt2) || (nT1<nf2) )) { return false;//端口范围冲突 } return true; } /******************************************************************** **字符串相关 *********************************************************************/ //取得字符串的字节数(一个汉字占三个字节) function strlen(str) { var cnt = 0; for( i=0; i<str.length; i++) { var value = str.charCodeAt(i); if( value < 0x080) { cnt += 1; } else if( value < 0x0800) { cnt += 2; } else { cnt += 3; } } return cnt; } function isInputVilid(tmp) { // var tmp = obj.value; if(tmp.indexOf('"')!=-1 || tmp.indexOf("<")!=-1 || tmp.indexOf(">")!=-1 || tmp.indexOf("'")!=-1 || tmp.indexOf("&")!=-1 || tmp.indexOf("%")!=-1 || tmp.indexOf("#")!=-1 || tmp.indexOf("=")!=-1 || tmp.indexOf("\")!=-1 || tmp.indexOf(":")!=-1 || tmp.indexOf(",")!=-1) { return false; } return true; } function encryptPasswd(str) { //dlan4.6 只支持https登录, 不在需要控件加密 //var pwdStr = escape(str); //return active.EncryptUTF8(pwdStr); //return active.Encrypt(str); return str; } //验证IP范围是否有效(起始IP不能大于结束IP) function isIPinRange(strIP, strIPFrom,strIPTo) { var ip = IPatol(strIP); var ip1 = IPatol(strIPFrom); var ip2 = IPatol(strIPTo); if(ip1>ip2) { return false; //起始IP大于结束IP } if (ip < ip1 || ip > ip2) { return false; } return true; } /******************************************************************** **webagent相关 *********************************************************************/ //判断strIpPort是否是ip:port的形式。比如1.2.3.4#1.2.3.5:4009 function isIpPort(strIpPort) { if (strIpPort == null || strIpPort.length == 0) { return false; } var rex = /^([0-9.]+#){0,3}[0-9.]+:d+$/;//判断是否是ip1#ip2#ip3:port if ( ! rex.test(strIpPort) ) { return false; } var arr = strIpPort.split(/:|#/); if ( ! isPort(arr[arr.length-1]) ) { return false; } for (i = 0 ;i < arr.length-1 ; i++) { if ( ! isIP(arr[i]) ) { return false; } } return true; } //判断strDomainPort是否是 动态域名:端口 的形式 function isDomainPort(strDomainPort) { if (strDomainPort == null || strDomainPort.length == 0) { return false; } rex=/^([w-]+.)+[a-zA-Z]+:(d){1,5}$/ if ( ! rex.test(strDomainPort)) { return false; } var arr = strDomainPort.split(":"); if ( ! isPort(arr[1]) ) { return false; } return true; } //判断strUrl是否是url形式 function isUrl(strUrl) { if (strUrl == null || strUrl.length == 0) { return false; } rex=/^([w-]+.)+[w]+(:(d){1,5})?(/[w- .?%&=]*)+(/)?$/ strUrl = encodeURI(strUrl); //以防路径名有中文 if (rex.test(strUrl)) { return true; } return false; } /*从strWebagt获取正确的webagent地址 首先自动转换句号冒号到英文, 然后判断webagent是否为下面的格式, 1> 固定IP:端口(其中固定IP支持多IP,最多支持四个IP,各IP之间以#号分隔,如:202.96.137.75#60.28.239.21:4009); 2> 动态域名:端口(如:www.sangfor.com.cn:4009); 3> 动态网页(如:www.sangfor.com/NG4.0/test.php). 如果不是返回null,如果是则返回转换得到的地址 */ function getRightWebagent(strWebagt) { if (strWebagt == null || strWebagt.length == 0) { return null; } strWebagt = strWebagt.replace(/^http(:|:)///,""); //如果http://头 则去掉 // 将"/"以前的句号冒号全部替换成英文的 var arr = strWebagt.split("/"); arr[0] = arr[0].replace(/:/g,":"); arr[0] = arr[0].replace(/。/g,"."); strWebagt = arr.join("/"); if ( isIpPort(strWebagt) ) { return strWebagt; } if ( isDomainPort(strWebagt) ) { return strWebagt; } if ( isUrl(strWebagt) ) { return strWebagt; } return null; }