我有来自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应用程序中,因为它的价值)。
假设您的标题始终如您所发布的那样:
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"
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"]
如果"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)
。 &
是Ruby的safe navigation operator,它在v2.3中首次亮相。