(Просто хочу отметить, что я проверил другие вопросы, похожие на мои, но не смог найти ни одного, в котором не использовалось регулярное выражение, а те, которые не использовали, похоже, не работали для моей ситуации.)
Учитывая поле 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.info(arr)
console.info(wrongIps)
Конечно, вы можете сделать обратное и получить только действительные IP-адреса.
с 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.info(isValidIPs('1.1.1.1,2.2.2.2,3.3.3.,4.4.4.256')); // false
console.info(isValidIPs('1.1.1.1,2.2.2.2,4.4.4.256')); // false
console.info(isValidIPs('1.1.1.1,2.2.2.2')); // true
// with space between range
console.info(isValidIPs('1.1.1. 1, 2.2.2.2')); // false
// with space
console.info(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.info('Invalid IP Address : ' + v);
}else{
console.info('Valid IP Address : ' + v);
}
}else{
console.info('Invalid IP Address : ' + v);
}
});
Используя split
, map
и reduce
.
split(",")
, а второе измерение является результатом map
первого измерения и split(".")
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.info(validIPs(test1))
console.info(validIPs(test2))
console.info(validIPs(test3))
console.info(validIPs(test4))
console.info(validIPs(test5))
console.info(validIPs(test6))
console.info(validIPs(test7))
Что не так с регулярным выражением, а также пробовали ли вы что-то до сих пор? Например, разделить
"."
и проверить, является ли каждый элемент числом от 0 до 255?