只是要注意,我已经检查了其他类似的问题,但是找不到未使用正则表达式的问题以及未使用正则表达式的问题,这些问题似乎都不适合我的情况。< / strong>
给出一个textarea字段,用户可以使用javascript输入多个IP地址,以逗号分隔,这是验证所有这些逗号分隔IP地址的最佳方法,例如:
1.1.1.1,2.2.2.2,3.3.3.,4.4.4.256
我显然需要测试有效的IP范围以及三个点和四个数字。
我希望不使用正则表达式的解决方案
答案 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地址。
答案 1 :(得分:0)
带有String.prototype.split
和Array.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)
使用split
,map
和reduce
。
split(",")
的结果,第二维是map
第一维和split(".")
的结果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))