ruby - 从包含 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 应用程序中,值得一提)。
解决方案
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 的安全导航算子,在 v2.3 中首次亮相。
推荐阅读
- javascript - 如何使用 xlsx npm 库将嵌套的 json 对象转换为 excel 表?
- ios - 当两次选择 tableview 单元格时,它会因发现意外 nil 的错误而崩溃
- ios - 无法通过情节提要为活动指示器设置动画
- mysql - 使用 .NET Core 服务从 MySQL 读取 č、ć 和 đ
- javascript - 如何从地理编码器中仅获取城市名称?
- r - ggplot2 在 geom_bar 边界中的间隙
- excel - Excel VBA /根据字符数将字符串拆分为列
- c++ - 具有不同返回类型的变体访客
- java - 如何用 IP 和端口划分字符串?
- ios - Azure 上的 iOS 构建设置失败,文件存在错误