代码之家  ›  专栏  ›  技术社区  ›  Shpigford

从同时包含IPv4和IPv6的Ruby字符串中获取IPv4?

  •  0
  • Shpigford  · 技术社区  · 6 年前

    X-Forwarded-For 同时包含IPv4和IPv6地址的标头。

    我只需要从字符串中提取IPv4地址。

    它是逗号分隔的,但是它们的顺序改变了,所以我不能只拆分和拉第二项。

    例子: header = 2600:1740:8540:cff9:1c50:617:c9c5:63f7, 165.154.107.112

    我最终只想 165.154.107.112 .

    我使用的是Ruby 2.5.1 (这恰好是Rails 5.2.0应用程序的内部版本,值得一提)

    2 回复  |  直到 6 年前
        1
  •  0
  •   emi    6 年前

    假设你的标题总是和你发布的一样:

    require 'ipaddr'
    
    header = "165.154.107.112, 2600:1740:8540:cff9:1c50:617:c9c5:63f7"
    
    ip = header.split(', ').select {|ip| ip if IPAddr.new(ip).ipv4? }.pop
    
    # => "165.154.107.112"
    
        2
  •  0
  •   Cary Swoveland    6 年前
    header = "2600:1740:8540:cff9:1c50:617:c9c5:63f7, 165.154.107.112, 166.155.108.113"
    
    header.split(/\s?,\s?/).find { |s| IPAddr.new(s).ipv4? }
      #=> "165.154.107.112"
    

    header.split(/,\s+/).select { |s| IPAddr.new(s).ipv4? }
      #=> ["165.154.107.112", "166.155.108.113"]
    

    看到了吗 IPAddr::new IPAddr#ipv4?

    如果 "header = " str ,替换 header.split 具有 str[/\d.+/].split

    如果字符串可能包含无效IP地址的文本,则可以编写以下代码。

    header.split(/\s?,\s?/).find { |s| (IPAddr.new(s) rescue nil)&.ipv4? }
    

    IPAddr.new('cat') IPAddr::InvalidAddressError (invalid address) & 是鲁比的吗 safe navigation operator