Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 23.01.2015, 19:13
Профессор
Отправить личное сообщение для Kvark Посмотреть профиль Найти все сообщения от Kvark
 
Регистрация: 02.04.2013
Сообщений: 225

Помогите написать RegExp для вычленения субнетов из IP адресов
Приветсвую, не силен я в них (вообще космос для меня эти регулярки) а очень нужно такую вещь получить - есть 3 типа диапозонов ип адресов:
10.17.0.0/16
10.18.1.0/24
10.19.5.12/30

Мне хочется получить (точка в конце важна):
а) если 3 и 4 октет == 0 => 10.17.
б) если 3 октет !=0 => 10.18.1.
с) если 4 октет !=0 => 10.19.5.12.

как такое можно одной функцией RegExp cделать и можно ли?
Пособите кто разбираеться... очень надо
Ответить с цитированием
  #2 (permalink)  
Старый 23.01.2015, 19:36
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,479

Что-то не особо понял что нужно. Если нужно привести подсети выше к виду ниже, то можно как-то так:
str = '10.17.0.0/16\n10.18.1.0/24\n10.19.5.12/30';
str = str.replace(/(\d{1,3}\.\d{1,3})(?:\.0\.0|(\.\d{1,3})\.0|(\.\d{1,3}\.\d{1,3}))\/\d{1,2}/g, '$1$2$3.');
alert(str)

Если же нужно работать с ip из этих подсетей, то что делать не понятно.
__________________
29375, 35

Последний раз редактировалось Aetae, 23.01.2015 в 21:23.
Ответить с цитированием
  #3 (permalink)  
Старый 23.01.2015, 19:43
Профессор
Отправить личное сообщение для Kvark Посмотреть профиль Найти все сообщения от Kvark
 
Регистрация: 02.04.2013
Сообщений: 225

ну суть такая - есть куча ип адресов в базе, я их хочу сгрупировать по подсетям, что бы потом привязать к местности. какая подсеть на каком роутере известно, где стоит роутер тоже, не понятно как их увязать
у меня есть один аттрибут что я могу использовать для создания зависимости, поэтому мне нужно вычленить из ип адреса подсеть
Ответить с цитированием
  #4 (permalink)  
Старый 23.01.2015, 19:51
Аватар для ruslan_mart
Профессор
Отправить личное сообщение для ruslan_mart Посмотреть профиль Найти все сообщения от ruslan_mart
 
Регистрация: 30.04.2012
Сообщений: 3,018

Вариант на скорую руку, без регулярок:

function getSubIP(ip) {
      ip = ip.split('/')[0].split('.');
      if(!+ip[2]) ip.splice(2, 4);
      else if(!+ip[3]) ip.splice(3, 4);
      return ip.join('.') + '.';
}
      
alert( getSubIP('10.17.0.0/16') );
      
alert( getSubIP('10.18.1.0/24') );
      
alert( getSubIP('10.19.5.12/30') );
Ответить с цитированием
  #5 (permalink)  
Старый 23.01.2015, 21:25
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,479

Набросал сортировщик по подсетям:
var input = '10.17.0.0/16\n10.18.1.0/24\n9.9.9.9\n10.19.5.12/30\n10.18.1.2\n10.18.1.22\n10.19.5.13\n10.17.0.1\n10.17.1.0\n10.17.1.20\n';
 
alert('На входе:\n' + input)
 
function sortSubnets(input){
    var subnets = {},
        unknown = [];
 
    input = input.replace(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\/\d{1,2}/g, function(subnet){
        var ips = subnets[subnet] = [];
        var subnet = subnet.split(/\D/);
 
        ips.firstIP = new DataView(new Uint8Array(subnet.slice(0,4)).buffer).getUint32(0);
        ips.lastIP = ips.firstIP + Math.pow(2, 32 - subnet[4]) - 1;
 
        return '';
    })
 
    var subnetsKeys = Object.keys(subnets);
 
    input.replace(/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/g, function(ip){
        var uintIP = new DataView(new Uint8Array(ip.split(/\D/)).buffer).getUint32(0);
        if(
            !subnetsKeys.some(function(subnet){
                subnet = subnets[subnet];
                if(subnet.firstIP <= uintIP && subnet.lastIP >= uintIP) {
                    return subnet.push(ip)
                };
            })
        ) unknown.push(ip);
 
        return '';
    })
 
    if(unknown.length){
        subnets.unknown = unknown;
    }
 
    return subnets
}
 
alert('На выходе:\n' + JSON.stringify(
    sortSubnets(input)
, 0, '\t'));

На вход принимает строку содержащую ip и подсети и раскидывает как надо, на выходe объект.
Вообще это задачка не для js.)
__________________
29375, 35

Последний раз редактировалось Aetae, 23.01.2015 в 21:38.
Ответить с цитированием
  #6 (permalink)  
Старый 26.01.2015, 13:05
Профессор
Отправить личное сообщение для Kvark Посмотреть профиль Найти все сообщения от Kvark
 
Регистрация: 02.04.2013
Сообщений: 225

Спасибо, сложность в том что яваскрипта как такового не поддерживается, но в той строке где создается зависимость нет возможности задать функцию, но они используют обертку яваскрипта чтобы выполнить регехп (не спрашивайте почему в НР такие криворукие програмеры) поэтому все что я могу это использовать RegExp выражение
Ответить с цитированием
  #7 (permalink)  
Старый 26.01.2015, 16:21
Профессор
Отправить личное сообщение для Kvark Посмотреть профиль Найти все сообщения от Kvark
 
Регистрация: 02.04.2013
Сообщений: 225

Все заработало! Спасибо за подсказку от Aetae

Последний раз редактировалось Kvark, 26.01.2015 в 19:50.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хочу написать скрипт для прайса Lisenok Общие вопросы Javascript 2 10.04.2016 11:44
Помогите написать код для интернет магазина журнала Grigor Элементы интерфейса 1 26.10.2014 18:07
Помогите, пжлста, найти (или написать) скрипт для смены картинок. Artweb Работа 9 25.02.2011 11:28
помогите написать аналог строки include("index.php?open=1") на js bushstas Общие вопросы Javascript 1 19.07.2009 02:48