从同时包含 IPv4 和 IPv6 的 Ruby 字符串中获取 IPv4?
Get IPv4 out of a Ruby string that contains both IPv4 and IPv6?
我有来自 X-Forwarded-For
header 的字符串,其中包含 IPv4 和 IPv6 地址。
我只需要从字符串中提取 IPv4 地址。
它是 comma-separated,但是它们的顺序发生了变化,所以我不能只拆分并拉出第二个项目。
示例: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 应用程序中,物有所值) .
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 and 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 的 safe navigation operator,它在 v2.3 中首次亮相。
假设您的 header 始终与您发布的一样:
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"
我有来自 X-Forwarded-For
header 的字符串,其中包含 IPv4 和 IPv6 地址。
我只需要从字符串中提取 IPv4 地址。
它是 comma-separated,但是它们的顺序发生了变化,所以我不能只拆分并拉出第二个项目。
示例: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 应用程序中,物有所值) .
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 and 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 的 safe navigation operator,它在 v2.3 中首次亮相。
假设您的 header 始终与您发布的一样:
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"