当我这样做的时候
ip = request.env["REMOTE_ADDR"]
我得到了客户端的IP地址。但是,如果我想验证变量中的值是否真的是一个IP,该怎么办?我该怎么做?
请帮帮忙。提前谢谢。如果这个问题被重复了,我很抱歉,我没有努力去寻找它。
编辑
IPv6 IP的情况如何??
发布于 2010-09-03 19:30:00
为什么不让a library为你验证它呢?您不应该引入难以维护的复杂正则表达式。
% gem install ipaddress
然后,在您的应用程序中
require "ipaddress"
IPAddress.valid? "192.128.0.12"
#=> true
IPAddress.valid? "192.128.0.260"
#=> false
# Validate IPv6 addresses without additional work.
IPAddress.valid? "ff02::1"
#=> true
IPAddress.valid? "ff02::ff::1"
#=> false
IPAddress.valid_ipv4? "192.128.0.12"
#=> true
IPAddress.valid_ipv6? "192.128.0.12"
#=> false
您也可以使用Ruby的内置IPAddr
类,但它不适合用于验证。
当然,如果IP地址是由应用程序服务器或框架提供给您的,则根本没有理由进行验证。只需使用提供给您的信息,并优雅地处理任何异常。
发布于 2013-03-01 20:32:15
Ruby已经在标准库中提供了所需的Regex。查看resolv。
require "resolv"
"192.168.1.1" =~ Resolv::IPv4::Regex ? true : false #=> true
"192.168.1.500" =~ Resolv::IPv4::Regex ? true : false #=> false
"ff02::1" =~ Resolv::IPv6::Regex ? true : false #=> true
"ff02::1::1" =~ Resolv::IPv6::Regex ? true : false #=> false
如果你喜欢走捷径的话...
require "resolv"
!!("192.168.1.1" =~ Resolv::IPv4::Regex) #=> true
!!("192.168.1.500" =~ Resolv::IPv4::Regex) #=> false
!!("ff02::1" =~ Resolv::IPv6::Regex) #=> true
!!("ff02::1::1" =~ Resolv::IPv6::Regex) #=> false
玩得开心!
更新(2018-10-08):
从下面的评论来看,我喜欢这个非常简短的版本:
!!(ip_string =~ Regexp.union([Resolv::IPv4::Regex, Resolv::IPv6::Regex]))
非常优雅地使用rails (也是下面的答案):
validates :ip,
:format => {
:with => Regexp.union(Resolv::IPv4::Regex, Resolv::IPv6::Regex)
}
发布于 2012-06-20 12:24:00
require 'ipaddr'
!(IPAddr.new(str) rescue nil).nil?
我使用它来进行快速检查,因为它使用内置库。同时支持ipv4和ipv6。虽然它不是很严格,但它说'999.999.999.999‘是有效的,例如。如果您需要更精确的答案,请查看获胜的答案。
https://stackoverflow.com/questions/3634998
复制相似问题