在不使用正则表达式的情况下验证由逗号分隔的多个IP地址

时间:2019-04-09 12:57:12

标签: javascript

只是要注意,我已经检查了其他类似的问题,但是找不到未使用正则表达式的问题以及未使用正则表达式的问题,这些问题似乎都不适合我的情况。< / strong>

给出一个textarea字段,用户可以使用javascript输入多个IP地址,以逗号分隔,这是验证所有这些逗号分隔IP地址的最佳方法,例如:

1.1.1.1,2.2.2.2,3.3.3.,4.4.4.256

我显然需要测试有效的IP范围以及三个点和四个数字。

我希望不使用正则表达式的解决方案

4 个答案:

答案 0 :(得分:1)

您可以分割每个ip并检查数字是否有效。您也可以检查点(。)是否为4。

function validateIp(ip) {
    if ( ip == null || ip === '' ) {
    return true;
  }

  const parts = ip.split('.');
  if(parts.length !== 4) {
    return true;
  }

  for(let i = 0; i < parts.length; i++) {
    const part = parseInt(parts[i]);
    if(part < 0 || part > 255) {
        return true;
    }
  }

  if(ip.endsWith('.')) {
    return true;
  }

  return false;
}

const input = '1.1.1.1,2.2.2.2,3.3.3.,4.4.4.256';
const arr = input.split(',');
const wrongIps = arr.filter(validateIp);


console.log(arr)
console.log(wrongIps)

当然,您可以做相反的事情,仅获取有效的IP地址。

Example

答案 1 :(得分:0)

带有String.prototype.splitArray.prototype.every

const isValidIP = (ip) => {
  const ranges = ip && ip.trim().split('.');
  
  if(ranges && ranges.length === 4) {
    return ranges.every(range => range && !/\s/g.test(range) && (255 - range) >= 0);
  }
  
  return false;
}

const isValidIPs = (input) => input && input.split(',').every(isValidIP);


console.log(isValidIPs('1.1.1.1,2.2.2.2,3.3.3.,4.4.4.256'));  // false
console.log(isValidIPs('1.1.1.1,2.2.2.2,4.4.4.256'));         // false
console.log(isValidIPs('1.1.1.1,2.2.2.2'));                   // true
// with space between range
console.log(isValidIPs('1.1.1. 1, 2.2.2.2'));                 // false
// with space
console.log(isValidIPs(' 1.1.1.1 , 2.2.2.2 '));               // true

答案 2 :(得分:0)

尝试这种方式:

var ip = "1.1.1.1,2.2.2,3.3.3.,4.4.4.256";
ip = ip.split(',');
ip.forEach(function(v,k){
	var ips = v.split('.');
	if(ips.length == 4){
		var flagip = 0;
		ips.forEach(function(v,k){
			if(isNaN(parseInt(v)) || parseInt(v) < 0 || parseInt(v) > 255){
				flagip = 1;
		 	}
		});
		if(flagip == 1){
			console.log('Invalid IP Address : ' + v);
		}else{
			console.log('Valid IP Address : ' + v);
		}
	}else{
		console.log('Invalid IP Address : ' + v);
    }
});

答案 3 :(得分:0)

使用splitmapreduce

  1. 拆分为二维数组,其中第一维是split(",")的结果,第二维是map第一维和split(".")的结果
  2. reduce每个维度,其中第一个维度用于检查第二个维度的length。然后,检查第二个数组中的每个值是否为0-255范围内的有效正整数(在this question的帮助下)

如果有空格,此方法将返回false

function isNormalInteger(str) {
    var n = Math.floor(Number(str));
    return n !== Infinity && String(n) === str && n >= 0;
}

function validIPs(input) {
  return input.split(",").map(ip => ip.split(".")).reduce((acc, curr) => {
    if (curr.length === 4) {
      return acc && curr.reduce((acc2, curr2) => {
        return acc2 && isNormalInteger(curr2) && parseInt(curr2) >= 0 && parseInt(curr2) < 256
      }, true)
    }
    return acc && false
  }, true)
}

let test1 = "1.1.1.1,2.2.2.2,3.3.3.,4.4.4.256"
let test2 = "1.1.1.1,2.2.2.2,3.3.3.3,4.4.4.256"
let test3 = "-1.1.1.1,2.2.2.2,3.3.3.3,4.4.4.255"
let test4 = "1.1.1.1,2.2.2.2,3.3.3.3,4.4.4.255"
let test5 = "1.1.1.1,19.91.21.63"
let test6 = "1.1.1.1,19..91.21.63"
let test7 = "1.1.1.1,19.91. 21.63"

console.log(validIPs(test1))
console.log(validIPs(test2))
console.log(validIPs(test3))
console.log(validIPs(test4))
console.log(validIPs(test5))
console.log(validIPs(test6))
console.log(validIPs(test7))