首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何检查字符串中的值是否为IP地址

如何检查字符串中的值是否为IP地址
EN

Stack Overflow用户
提问于 2010-09-03 18:49:07
回答 13查看 24.6K关注 0票数 34

当我这样做的时候

代码语言:javascript
复制
ip = request.env["REMOTE_ADDR"]

我得到了客户端的IP地址。但是,如果我想验证变量中的值是否真的是一个IP,该怎么办?我该怎么做?

请帮帮忙。提前谢谢。如果这个问题被重复了,我很抱歉,我没有努力去寻找它。

编辑

IPv6 IP的情况如何??

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2010-09-03 19:30:00

为什么不让a library为你验证它呢?您不应该引入难以维护的复杂正则表达式。

代码语言:javascript
复制
% gem install ipaddress

然后,在您的应用程序中

代码语言:javascript
复制
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地址是由应用程序服务器或框架提供给您的,则根本没有理由进行验证。只需使用提供给您的信息,并优雅地处理任何异常。

票数 40
EN

Stack Overflow用户

发布于 2013-03-01 20:32:15

Ruby已经在标准库中提供了所需的Regex。查看resolv

代码语言:javascript
复制
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

如果你喜欢走捷径的话...

代码语言:javascript
复制
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):

从下面的评论来看,我喜欢这个非常简短的版本:

代码语言:javascript
复制
!!(ip_string =~ Regexp.union([Resolv::IPv4::Regex, Resolv::IPv6::Regex]))

非常优雅地使用rails (也是下面的答案):

代码语言:javascript
复制
validates :ip,
          :format => {
            :with => Regexp.union(Resolv::IPv4::Regex, Resolv::IPv6::Regex)
          }
票数 48
EN

Stack Overflow用户

发布于 2012-06-20 12:24:00

代码语言:javascript
复制
require 'ipaddr'
!(IPAddr.new(str) rescue nil).nil?

我使用它来进行快速检查,因为它使用内置库。同时支持ipv4和ipv6。虽然它不是很严格,但它说'999.999.999.999‘是有效的,例如。如果您需要更精确的答案,请查看获胜的答案。

票数 15
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3634998

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档