Rails 3:验证 IP 字符串

Posted

技术标签:

【中文标题】Rails 3:验证 IP 字符串【英文标题】:Rails 3: Validate IP String 【发布时间】:2011-04-14 22:42:26 【问题描述】:

在 Rails 3 中,是否有内置方法可以查看字符串是否为有效 IP 地址?

如果没有,最简单的验证方法是什么?

【问题讨论】:

【参考方案1】:

只是想补充一点,您可以在一个 Resolv::IPv4::Regex 中使用构建而不是编写自己的模式

require 'resolv'

validates :gateway, :presence => true, :uniqueness => true,
  :format =>  :with => Resolv::IPv4::Regex 

【讨论】:

不确定他们何时添加了此功能,但这要容易得多 是的,这要容易得多。 @Dex 至少从 ruby​​ 1.9.2 开始就存在了 我可以确认it's in Ruby 1.8.7 这是一个非常好的和干净的解决方案。适用于 Ruby 1.9.3 和 Rails 3.2 只是想在这里注意,还有 Resolv::AddressRegex 表达式,它允许 IPv4 和 IPv6 地址。【参考方案2】:

在 Rails 3 中使用 ActiveRecord 进行验证的 Rails 方法是:

@ip_regex = /^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))3$/

validates :gateway, 
          :presence => true, 
          :uniqueness => true,
          :format =>  :with => @ip_regex  

这里有很好的资源:@​​987654321@

【讨论】:

【参考方案3】:

您也可以调用标准库 IPAddr.new 来解析 subnetsIPV6 和其他很酷的东西:(IPAddr) 并返回 nil,如果格式错误。

只要做:

valid = !(IPAddr.new('192.168.2.0/24') rescue nil).nil?  
#=> true

valid = !(IPAddr.new('192.168.2.256') rescue nil).nil?  
#=> false

【讨论】:

【参考方案4】:

如果您不需要接受子网,您可以使用下面提到的 Jack 的 Resolv::IPv4::Regex

如果你需要接受它,activemodel-ipaddr_validatorgem 可以帮助你。 (免责声明:我是 gem 的作者)

validates :your_attr, ipaddr: true

【讨论】:

效果很好。也许值得添加它是 your gem 的免责声明。【参考方案5】:

我不太了解 RoR,但如果您没有找到任何用于验证 IP 地址的内置方法。

试试这个正则表达式:

"^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))3$"

验证 IP 地址。

我最近在一个模块中使用它,所以在桌面上使用它。

【讨论】:

【参考方案6】:

你应该使用Regular Expression

这是你想要的:

/^([1-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])(\.
([0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]))3$/.match("#@systemIP")

【讨论】:

【参考方案7】:

你也可以使用Regexy::Web::IPv4,它也可以匹配ip地址和端口号。

【讨论】:

以上是关于Rails 3:验证 IP 字符串的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3 验证 IPv4 和 IPv6 格式

如何在 Rails 验证错误中突出显示字段

在 Rails 模型中一起验证日期和时间字段

是否可以在 Rails 模型验证方法中执行一些 Javascript?

是否可以在数据库列中的字符串上放置最小长度,或者只能通过模型 上的验证来完成?

验证字符串是不是对 IP 地址有效