Skip to content

Instantly share code, notes, and snippets.

@andreyselin
Last active February 4, 2020 02:23
Show Gist options
  • Save andreyselin/658084c05d4134996712cdcce73a3ae3 to your computer and use it in GitHub Desktop.
Save andreyselin/658084c05d4134996712cdcce73a3ae3 to your computer and use it in GitHub Desktop.

Напишите алгоритм валидации IPv4 адреса в Dot-десятичной нотации. IP является валидным, если состоит из четырех октетов, со значениями от 0 до 255 включительно. На вход функции подается строка. На выходе ожидается булево значение true или false

Примеры

Валидные: 1.2.3.4, 123.45.67.89

Невалидные: 1.2.3, 1.2.3.4.5, 123.456.78.90, 123.045.067.089

Обратите внимание, что запись с ведущими нулями (например, 01.02.03.04) так же невалидна.

@vugluskr86
Copy link

return "123.045.067.089".split('.').reduce((m,v)=>{ return m + (v.charAt(0) !== '0' && parseInt(v) >= 0 && parseInt(v) <= 255 ? 1 : 0) }, 0) === 4

@shamsartem
Copy link

@vugluskr86, не провалидирует если не является строкой и например вот такое тоже не сможет '123.123.123.01.123' а еще parsInt два раза считает одно и то же и не гарантирует ничего (например '123.123.123sdfsdf.123' провалидируется не правильно)

Стучитесь в @shamsartem если найдете в моем решении баги

function IPv4isValid(IPv4){
    // check if it's a string
    if(!Object.prototype.toString.call(IPv4) === "[object String]") return false
    const arr = IPv4.split('.')
    // check if it consists of 4 parts
    if(arr.length !== 4) return false
    // check if each part is a number berween 0 and 255
    const isDecimalRegex = /^(0|(?!0)\d+)$/
    return arr.reduce((a, v) => {
        if (!a || !isDecimalRegex.test(v)) return false
        const n = parseInt(v, 10)
        return n >= 0 && n <= 255
    }, true)
}

@shamsartem
Copy link

shamsartem commented Nov 26, 2019

да наверное вот так проще

function IPv4isValid(IPv4){
    return /^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/.test(IPv4)
}

@mol4anovma
Copy link

mol4anovma commented Nov 27, 2019

function checkIP(input) {
  return input.split('.').reduce((a, b) => a += (`${Math.abs(parseInt(b, 10))}` === b && parseInt(b) <= 255) ? 1 : 0, 0) === 4;
}

@vugluskr86
Copy link

vugluskr86 commented Nov 27, 2019

function check(ipString) {
const octets = ipString.split('.');
if(octets.length !== 4) {
return false;
}

return octets.reduce((m,v) => {
const val = parseInt(v);
return m + (v.charAt(0) !== '0' && val >= 0 && val <= 255 ? 1 : 0)
}, 0) === 4;
}

console.log(check("1.2.3.4"));
console.log(check("123.45.67.89"));

console.log(check("123.123.123.01.123"));
console.log(check("123.045.067.089"));
console.log(check("1.2.3"));
console.log(check("1.2.3.4.5"));
console.log(check("123.456.78.90"));
console.log(check("123.045.067.089"));
console.log(check("01.02.03.04"));

и parseInt вам теперь нормально, и вот эта 123.123.123.01.123 хуйня не пролетит

@LakaevAlex
Copy link

LakaevAlex commented Nov 28, 2019

function check(ipString) {
const octets = ipString.split('.');
if(octets.length !== 4) {
return false;
}

return octets.reduce((m,v) => {
const val = parseInt(v);
return m + (v.charAt(0) !== '0' && val >= 0 && val <= 255 ? 1 : 0)
}, 0) === 4;
}

console.log(check("1.2.3.4"));
console.log(check("123.45.67.89"));

console.log(check("123.123.123.01.123"));
console.log(check("123.045.067.089"));
console.log(check("1.2.3"));
console.log(check("1.2.3.4.5"));
console.log(check("123.456.78.90"));
console.log(check("123.045.067.089"));
console.log(check("01.02.03.04"));

и parseInt вам теперь нормально, и вот эта 123.123.123.01.123 хуйня не пролетит

check('1.2k.3.255')
слабонервным не смотреть
check("a" + confirm(function() {window.location.href = "https://gex.at.ua/"; return'kek' }()) + 'b')

@vugluskr86
Copy link

vugluskr86 commented Nov 29, 2019

function check(ipString) {
	const octets = ipString.split('.');
	if(octets.length !== 4) {
		return false;
	}

	return octets.reduce((m,v) => {
		if(!/\D/.test(v) && v.charAt(0) !== '0') {
			const val = parseInt(v);
			return m + (val >= 0 && val <= 255 ? 1 : 0)
		}
	}, 0) === 4;
}

check('1.2k.3.255') === false

check("a" + confirm(function() {window.location.href = "https://gex.at.ua/"; return'kek' }()) + 'b')
А вот это просто херня какая-то

Конечно можно проще регулярными выражениями проверить, как выше было предложено, но тогда весь смысл замеса теряется :)

@aeberzin
Copy link

function check(ipString) {
	const octets = ipString.split('.');
	if(octets.length !== 4) {
		return false;
	}

	return octets.reduce((m,v) => {
		if(!/\D/.test(v) && v.charAt(0) !== '0') {
			const val = parseInt(v);
			return m + (val >= 0 && val <= 255 ? 1 : 0)
		}
	}, 0) === 4;
}

check('1.2k.3.255') === false

check("a" + confirm(function() {window.location.href = "https://gex.at.ua/"; return'kek' }()) + 'b')
А вот это просто херня какая-то

Конечно можно проще регулярными выражениями проверить, как выше было предложено, но тогда весь смысл замеса теряется :)

const check = (ip) => ip.split('.').reduce((m,v) => m + (/^[1-9]\d*$/.test(v) && parseInt(v) <= 255 ? 1 : 5), 0) === 4;

@vugluskr86
Copy link

function check(ipString) {
	const octets = ipString.split('.');
	if(octets.length !== 4) {
		return false;
	}

	return octets.reduce((m,v) => {
		if(!/\D/.test(v) && v.charAt(0) !== '0') {
			const val = parseInt(v);
			return m + (val >= 0 && val <= 255 ? 1 : 0)
		}
	}, 0) === 4;
}

check('1.2k.3.255') === false

check("a" + confirm(function() {window.location.href = "https://gex.at.ua/"; return'kek' }()) + 'b')
А вот это просто херня какая-то

Конечно можно проще регулярными выражениями проверить, как выше было предложено, но тогда весь смысл замеса теряется :)

const check = (ip) => ip.split('.').reduce((m,v) => m + (/^[1-9]\d*$/.test(v) && parseInt(v) <= 255 ? 1 : 5), 0) === 4;

Идеально 🥇

@kickboxer
Copy link

function checkIP(ip) {
  if (typeof ip !== 'string') return false;
  const arr = ip.split('.');
  if (arr.length !== 4) return false;
  return arr.every(n => n >= 0 && n < 256);
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment