2013-02-11 22 views
11

Szukasz dobrego parsera adresów IP dla Javascript.Analizator adresów IP w JavaScript

Idealnie może przyjąć adres IP jako ciąg, a następnie zwrócić obiekt zawierający wszystkie elementy adresu IP, w tym port.

Dzięki!

+3

dla IPv4 lub IPv6? – SLaks

+0

Idealnie, oba typy. –

+5

Adres IP nie ma portu, co naprawdę chcesz przeanalizować? adres URL? – fiz

Odpowiedz

2
var v4 = '[\\d]{1-3}'; 
var v4d = '\\.'; 
var v4complete = v4+v4d+v4+v4d+v4+v4d+v4 
var v6 = '[\\da-fA-F]{0-4}'; 
var v6d = ':'; 
var v6complete = v6+v6d+v6+v6d+v6+v6d+v6+v6d+v6+v6d+v6+v6d+v6+v6d+v6; 
var regex = new RegExp('(' + v4complete + '(\\:\d+){0,1}|' 
          + '::|::1|' 
          + '\\[::\\]:\\d+|\\[::1\\]:\\d+|' 
          + v6complete + '|' 
          + '\\[' + v6complete + '\\]:\\d+' + ')', 'g'); 
var result = mystring.match(regex); 

Należy pamiętać, że to nie gwarantuje poprawności adresów (na przykład w zakresie 0-255 dla IPv4). Ale powinno pasować do ipów z portem lub bez niego.

+0

Klucz do małp: ':: 1' i' :: 'to [prawidłowe adresy IPv6] (http://tools.ietf.org/html/rfc4291#section-2.2). "Loopback" i "nieokreślony", odpowiednio.:) –

+0

@ JonathanLonowski, co powiesz teraz? – PinnyM

+0

Niezupełnie. Wszystkie wiodące 0 są opcjonalne, w tym '0800: 00db' ->' 800: db'. '::' oznacza tylko "* grupę 0s *." '/ ([\ da-f] {0,4} (: {1,2} [\ da-f] {0,4}) {1,7})/i' ([regexpal] (http://bit.ly/11CkDpF)) może być prymitywnym początkiem, który może złapać wiele "* wyraźnie nieważnych *" przypadków. Jest niezgodny z wieloma zastosowaniami '::' i prawdopodobnie innymi przypadkami. –

2
function parseIP(ip) { 
    if(ip.match(/^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3})/)!=null) { 
    ip = ip.match(/(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/); //clean posible port or http:// 
     return ip.split("."); //returns [a,b,c,d] array 
    } 
    else 
     return false; 
} 

To wystarczy. Metoda Split dzieli ciąg znaków według separatora. Jej przeciwieństwem jest Array.join(delimiter), która łączy tablicę z opcjonalnym delimiter między częściami.

+0

To może zadziałać, ale sądzę, że plakat chciałby czegoś mocniejszego. Pytając o parser, prawdopodobnie spodziewa się więcej niż tokenizacji. –

+0

No cóż, pozwolę mu zostawić komentarz, że chce czegoś więcej. Tymczasem dodam analizę IPv6. –

+0

To nie przeanalizuje "portu" - cokolwiek to może być. – Samsquanch

0

Oto, co wymyśliłem.

  • Analizuje stary rodzaj adresów IP, a nie nowy IPv6.
  • Nie przeprowadza także sprawdzania poprawności, która byłaby tylko przeszkodą dla mojego przypadku użycia .

::

// REGEX to break an ip address into parts 
var ip_regex = /(\d+)\.(\d+)\.(\d+)\.(\d+)(?:\.(\d+))?(?::(\d+))?/ig; 

// Parse the ip string into an object containing it's parts 
var parse_ip_address = function(ip_string){ 

    // Use Regex to get the parts of the ip address 
    var ip_parts = ip_regex.exec(ip_string); 

    // Set ip address if the regex executed successfully 
    if(ip_parts && ip_parts.length > 6){ 
     // Set up address object to elements in the list 
     var ip_address = { 
      'A':  ip_parts[1], 
      'B':  ip_parts[2], 
      'C':  ip_parts[3], 
      'D':  ip_parts[4], 
      'E':  ip_parts[5], 
      'port': ip_parts[6] 
     } 
     // Would rather not fiddle with 'undefined' value 
     if(typeof ip_parts[5] != 'undefined') { 
      ip_address[5] = null; 
     } 
    } 

    // Return object 
    return ip_parts; 
}; 
1

natknąłem to pytanie podczas wdrażania Safe Browsing url canonicalization w JS. Tutejsze odpowiedzi są pomocne, a oto niektóre JS wymyśliłem, że robi adresy IP ósemkowy & hex, w przypadku jest to pomocne, aby ktokolwiek w przyszłości:

function verifyIP4(address) { 
    var ip4DecimalPattern = '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))$'; 
    var ip4HexPattern = '^(?:(?:0x[0-9a-f]{1,2})\.){3}(?:0x[0-9a-f]{1,2})$'; 
    var ip4OctalPattern = '^(?:(?:03[1-7][0-7]|0[12][0-7]{1,2}|[0-7]{1,2})\.){3}(?:03[1-7][0-7]|0[12][0-7]{1,2}|[0-7]{1,2})$'; 

    var isIP4Decimal = isIP4Hex = isIP4Octal = false; 
    var base = 10; 

    isIP4Decimal = address.match(ip4DecimalPattern) != null; 
    isIP4Hex = address.match(ip4HexPattern) != null; 
    isIP4Octal = address.match(ip4OctalPattern) != null; 

    if (isIP4Hex || isIP4Octal) { 
    if (isIP4Hex) { 
     base = 16; 
    } else if (isIP4Octal) { 
     base = 8; 
    } 
    return address.split('.').map(num => parseInt(num, base)).join('.'); 
    } 
    return false; 
} 
Powiązane problemy