【问题标题】:IP Address Parser in JavascriptJavascript 中的 IP 地址解析器
【发布时间】:2013-01-27 03:48:05
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 一个IP地址没有端口,你到底想解析什么?网址?
  • 我不是专家,但这个社区似乎认为端口处理应该包含在 IP 解析器中:rosettacode.org/wiki/Parse_an_IP_Address
  • @ChrisDutrow 该社区的术语很混乱。虽然通过 TCP/UDP 连接到远程主机确实需要一个 IP 地址/端口对,但两者在概念上是截然不同的。
  • @ChrisDutrow 这是特定于特定用途的。 IP 地址本身不包含端口号,但应用程序可以出于自己的目的将它们组合在一起。在window.location 的情况下,这是host,由hostname(IP 地址)和port 组成。
  • 我无法理解为什么会有如此多的赞成票?仅仅因为我看不到“IP 地址的片段”是什么——那只是一堆数字——那又怎样?这个练习有什么意义? IP地址是一个数字,很重要。我真的只是好奇。

标签: javascript parsing ip-address


【解决方案1】:
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 有或没有端口。

【讨论】:

  • 活动扳手:::1::valid IPv6 addresses。分别是“环回”和“未指定”。 :)
  • @JonathanLonowski,现在怎么样?
  • 不完全。所有前导 0 都是可选的,包括 0800:00db -> 800:db:: 只是暗示“0 组”。 /([\da-f]{0,4}(:{1,2}[\da-f]{0,4}){1,7})/i (regexpal) 可能是一个粗略的开始,可以捕获许多“明显无效”的情况。它确实与:: 的多次使用不匹配,可能还有其他情况。
【解决方案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;
 }

这样就可以了。 Split 方法按分隔符拆分字符串。它的反面是Array.join(delimiter),它将数组与可选的delimiter 连接起来。

【讨论】:

  • 这可能会奏效,但我认为发帖者会想要一些更强大的东西。在我看来,在要求解析器时,他可能期望的不仅仅是标记。
  • 好吧,我会让他发表评论,他还想要什么。同时,我将添加 IPv6 解析。
  • 这将无法解析“端口”——不管它是什么。
  • 好吧,我想我无论如何都要引入正则表达式。另一方面,没有人在这里谈论港口。通过这样的过程,我们最终会解析整个 tcp 请求,不是吗?
【解决方案3】:

我在 JS 中实现 Safe Browsing url canonicalization 时遇到了这个问题。这里的答案很有帮助,这是我想出的一些 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;
}

【讨论】:

    【解决方案4】:

    这就是我想出的。

    • 它解析旧类型的 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;
    };
    

    【讨论】:

      猜你喜欢
      • 2010-09-27
      • 2023-04-07
      • 1970-01-01
      • 2015-09-14
      • 2020-08-06
      • 2014-10-11
      • 1970-01-01
      • 2013-03-25
      • 2014-10-26
      相关资源
      最近更新 更多