Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Проверка IP адреса. Просьба протестировать у себя код. (https://javascript.ru/forum/misc/39240-proverka-ip-adresa-prosba-protestirovat-u-sebya-kod.html)

ed-210 21.06.2013 22:46

Проверка IP адреса. Просьба протестировать у себя код.
 
Задача скрипта позволять вводить адреса в такой форме:
для IPv4 - 1-255.0-255.0-255.1-255
для IPv6 - 1-255.0-255.0-255.0-255.0-255.1-255
var ip = prompt('Проверка корректности записи IP адресов.\nВведите IP адрес:');
var reg = /^(2[0-5][0-5]|1\d\d|[1-9](?=\d)\d|[1-9])((\.(2[0-5][0-5]|1\d\d|[1-9](?=\d)\d|\d)){2}|(\.(2[0-5][0-5]|1\d\d|[1-9](?=\d)\d|\d)){4})\.(2[0-5][0-5]|1\d\d|[1-9](?=\d)\d|[1-9])$/;

var result, resultLength;
if (result = ip.match(reg)){

    resultLength = result[0].split('.').length;
	alert('Это правильный IPv'+ resultLength +' адрес:\n'+ result[0]);

} else {

    alert('Введенный вами адрес - ['+ ip +'] не корректен!');

}

Прошу протестировать и выразить свои мысли по поводу решения задачи. Большое спасибо заранее! :)

nerv_ 21.06.2013 23:49

регами такое не проверяют. split и сравнивать как число

ruslan_mart 23.06.2013 13:04

function IP(a)
{
   a = a.split('.');
   for(i=0; i<a.length; i++) if(!a[i] || a[i] > 255) return false;
   return true;
}


Может, как-то так :)

sexyQuery 23.06.2013 16:00

function isIPv4(addr) { 
    return /^(([01]?\d{1,2}|2[0-4]\d|25[0-5])(\.|$)){4}$/.test(addr);
}

sexyQuery 23.06.2013 16:03

диапазоны для IPv6 0x0-0xFFFF

melky 23.06.2013 19:40

а кто сказал, что ИПшники могут быть записаны только как циферки?

sexyQuery 24.06.2013 02:55

ipv6


/^([\da-f]{1,4}:){7}([\da-f]{1,4}|(([01]?\d{1,2}|2[0-4]\d|25[0-5])(\.|$)){4})$/i.test('0001:2222:3456:7890:abcd:e:fff:12.34.56.78')
true
/^([\da-f]{1,4}:){7}([\da-f]{1,4}|(([01]?\d{1,2}|2[0-4]\d|25[0-5])(\.|$)){4})$/i.test('2001:db8:1234:0000:0000:0000:0000:0000')
true

sexyQuery 24.06.2013 20:13

вот моя регулярка те на 1088 знаков работает как часы, разобраться не пытайся, она генерированная

/^(([\da-f]{1,4}:){7}([\da-f]{1,4}|(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5]))|::(([\da-f]{1,4}:){0,6}([\da-f]{1,4}|(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5]))?)?|([\da-f]{1,4}:){0,6}([\da-f]{1,4}|(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5]))?::|([\da-f]{1,4}:):([\da-f]{1,4}:){0,5}([\da-f]{1,4}|(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5]))|([\da-f]{1,4}:){1,2}:([\da-f]{1,4}:){0,4}([\da-f]{1,4}|(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5]))|([\da-f]{1,4}:){1,3}:([\da-f]{1,4}:){0,3}([\da-f]{1,4}|(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5]))|([\da-f]{1,4}:){1,4}:([\da-f]{1,4}:){0,2}([\da-f]{1,4}|(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5]))|([\da-f]{1,4}:){1,5}:([\da-f]{1,4}:)?([\da-f]{1,4}|(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5]))|([\da-f]{1,4}:){1,6}:([\da-f]{1,4}|(([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])\.){3}([1-9]?\d|1\d\d|2[0-4]\d|25[0-5])))$/i

sexyQuery 24.06.2013 20:15

это для ipv6
::
::1
1::
1:2:3:4:5:6:7:8
1:2:3::4:5:6:7
0Ffa::127.0.0.1

sexyQuery 24.06.2013 20:18

я так понял ipv4 может быть только на конце

sexyQuery 24.06.2013 21:02

uncompressIPv6('2001:db8::ff00:42:8329')
"2001:0db8:0000:0000:0000:ff00:0042:8329"
uncompressIPv6('2001:db8::ff00:42:8329') == '2001:0db8:0000:0000:0000:ff00:0042:8329' // с википедии пример
true
uncompressIPv6('::A:B:127.0.0.1')
"0000:0000:0000:0000:0000:000a:000b:127.0.0.1"

sexyQuery 24.06.2013 21:02

function uncompressIPv6(str) {
    if (isIPv6(str)) {
        str = str.toLowerCase();
        str = str.replace('::', '*');        
        var n = substrCount(str, ':');
        str = str.replace('*', new Array(8 - n).join(':'));
        var parts = str.split(':'), length = parts.length, i = 0;
        while (i < length) {
            parts[i] = strPad(parts[i++], 4, '0', 'left');
        }
        return parts.join(':');
    }
    return null;
}


Часовой пояс GMT +3, время: 11:49.