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



我有一个来自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"]

请参阅 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)&是Ruby的安全导航运算符,在v2.3中首次亮相。

最新更新