Помогите написать 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делать и можно ли? Пособите кто разбираеться... очень надо |
Что-то не особо понял что нужно. Если нужно привести подсети выше к виду ниже, то можно как-то так:
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 из этих подсетей, то что делать не понятно. |
ну суть такая - есть куча ип адресов в базе, я их хочу сгрупировать по подсетям, что бы потом привязать к местности. какая подсеть на каком роутере известно, где стоит роутер тоже, не понятно как их увязать
у меня есть один аттрибут что я могу использовать для создания зависимости, поэтому мне нужно вычленить из ип адреса подсеть |
Вариант на скорую руку, без регулярок:
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') ); |
Набросал сортировщик по подсетям:
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.) |
Спасибо, сложность в том что яваскрипта как такового не поддерживается, но в той строке где создается зависимость нет возможности задать функцию, но они используют обертку яваскрипта чтобы выполнить регехп (не спрашивайте почему в НР такие криворукие програмеры) поэтому все что я могу это использовать RegExp выражение :(
|
Все заработало! Спасибо за подсказку от Aetae
|
Часовой пояс GMT +3, время: 08:38. |