首页 > 解决方案 > 从包含 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 应用程序中,值得一提)

标签: rubystringipip-address

解决方案


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.splitstr[/\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 中首次亮相。


推荐阅读