簡體   English   中英

在不使用正則表達式的情況下驗證由逗號分隔的多個 IP 地址

[英]Validate multiple IP addresses separated by a comma without using regex

(只是想注意,我已經檢查了其他類似的問題,但找不到任何不使用正則表達式的問題,而那些沒有使用正則表達式的問題似乎對我的情況不起作用。)

給定一個 textarea 字段,用戶可以在其中輸入多個 IP 地址作為逗號分隔的字符串,使用 JavaScript,驗證所有這些逗號分隔的 IP 地址的最佳方法是什么,例如:

1.1.1.1,2.2.2.2,3.3.3.,4.4.4.256

我顯然需要測試有效的 IP 范圍以及三個點和四個數字。

我更喜歡不使用正則表達式的解決方案。

您可以拆分每個 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 地址。

例子

使用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

試試這種方式:

 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); } });

使用splitmapreduce

  1. 拆分為二維數組,其中第一維是split(",")的結果,第二維是map第一維和split(".")
  2. reduce每個維度,其中第一個維度用於檢查第二個維度的length 然后,檢查第二個數組中的每個值是否是 0-255 范圍內的有效正整數(在此問題的幫助下)

如果有空格,此方法返回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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM