11

为 Javascript 寻找一个好的 IP 地址解析器。

理想情况下,它可以将 IP 地址作为字符串接收,然后返回一个对象,其中包含 IP 地址的所有部分,包括端口。

谢谢!

4

4 回答 4

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;
 }

That will do it. Split method splits string by delimiter. Its opposite is Array.join(delimiter), which joins the array with optional delimiter between the pieces.

于 2013-02-11T22:48:08.127 回答
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);

请注意,这不能保证地址有效(例如,IPv4 的范围为 0-255)。但它应该匹配带有或不带有端口的ip。

于 2013-02-11T22:54:14.157 回答
2

我在 JS 中实现安全浏览 url 规范化时遇到了这个问题。这里的答案很有帮助,这是我想出的一些 JS,它们可以处理八进制和十六进制 IP 地址,以防将来对其他人有帮助:

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;
}
于 2016-07-07T20:42:15.293 回答
0

这就是我想出的。

  • 它解析旧的 IP 地址,而不是新的 IPv6。
  • 它也不进行验证,这只会成为我用例的障碍。

::

// 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;
};
于 2013-02-11T23:31:47.260 回答