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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从包含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::newIPAddr#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中首次亮相。

以上是关于从包含IPv4和IPv6的Ruby字符串中获取IPv4?的主要内容,如果未能解决你的问题,请参考以下文章

算法判断IP地址是不是合法的,包含IPv4和IPv6

在启用了IPV6的机器上获取客户端ipv4地址

IPv4与IPv6数据报格式

C# 获取本机IP地址,IPv4,IPv6(保姆级)

将 IPV4 转换为 IPV6 php

IPv4数据报格式和Ipv6数据报格式(长文,详细解释每个字段)