Проверка нескольких IP-адресов, разделенных запятой, без использования регулярных выражений

(Просто хочу отметить, что я проверил другие вопросы, похожие на мои, но не смог найти ни одного, в котором не использовалось регулярное выражение, а те, которые не использовали, похоже, не работали для моей ситуации.)

Учитывая поле textarea, в котором пользователь может ввести несколько IP-адресов в виде строки, разделенной запятой, используя JavaScript, что было бы лучшим средством для проверки всех этих IP-адресов, разделенных запятыми, например:

1.1.1.1,2.2.2.2,3.3.3.,4.4.4.256

Очевидно, мне нужно проверить действительные диапазоны IP-адресов, а также три точки и четыре числа.

Я бы предпочел решение, которое не использует регулярное выражение.

Что не так с регулярным выражением, а также пробовали ли вы что-то до сих пор? Например, разделить "." и проверить, является ли каждый элемент числом от 0 до 255?

Jeremy Thille 09.04.2019 15:02
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
1 065
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете разделить каждый 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.

  1. Разделить на 2D-массив, где первое измерение является результатом 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.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))

Другие вопросы по теме