如何检查URL是否有效

时间:2009-11-26 21:35:12

标签: ruby

如何检查字符串是否为有效的URL?

例如:

http://hello.it => yes
http:||bra.ziz, => no

如果这是一个有效的网址,我如何检查这是否与图像文件相关?

9 个答案:

答案 0 :(得分:164)

使用随Ruby分发的URI模块:

require 'uri'

if url =~ URI::regexp
    # Correct URL
end

AlexanderGünther在评论中说,它检查字符串是否包含一个URL。

要检查字符串是否为网址,请使用:

url =~ /\A#{URI::regexp}\z/

如果您只想查看网址(httphttps),请使用以下网址:

url =~ /\A#{URI::regexp(['http', 'https'])}\z/

答案 1 :(得分:41)

与上面的答案类似,我觉得使用这个正则表达式会更准确一些:

URI::DEFAULT_PARSER.regexp[:ABS_URI]

这将使带空格的URL无效,而URI.regexp则由于某种原因允许使用空格。

我最近发现了为不同的URI rgexps提供的快捷方式。您可以直接从URI::DEFAULT_PARSER.regexp.keys访问任何URI::#{key}

例如,可以从:ABS_URI访问URI::ABS_URI正则表达式。

答案 2 :(得分:29)

目前答案的问题是a URI is not an URL

  

URI可以进一步分类为定位符,名称或两者。该      术语“统一资源定位符”(URL)是指URI的子集      除了识别资源外,还提供了一种方法      通过描述其主要访问机制来定位资源      (例如,其网络“位置”)。

由于URL是URI的子集,因此很明显,专门针对URI的匹配将成功匹配不需要的值。例如,URNs

 "urn:isbn:0451450523" =~ URI::regexp
 => 0 

话虽如此,据我所知,Ruby没有默认的方法来解析URL,所以你很可能需要一个gem才能这样做。如果您需要专门以HTTP或HTTPS格式匹配URL,您可以执行以下操作:

uri = URI.parse(my_possible_url)
if uri.kind_of?(URI::HTTP) or uri.kind_of?(URI::HTTPS)
  # do your stuff
end

答案 3 :(得分:19)

我更喜欢Addressable gem。我发现它更智能地处理URL。

require 'addressable/uri'

SCHEMES = %w(http https)

def valid_url?(url)
  parsed = Addressable::URI.parse(url) or return false
  SCHEMES.include?(parsed.scheme)
rescue Addressable::URI::InvalidURIError
  false
end

答案 4 :(得分:11)

这是一个相当古老的条目,但我认为我会继续前进并做出贡献:

String.class_eval do
    def is_valid_url?
        uri = URI.parse self
        uri.kind_of? URI::HTTP
    rescue URI::InvalidURIError
        false
    end
end

现在您可以执行以下操作:

if "http://www.omg.wtf".is_valid_url?
    p "huzzah!"
end

答案 5 :(得分:7)

对我来说,我使用这个正则表达式:

/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix

选项:

  • i - 不区分大小写
  • x - 忽略正则表达式中的空格

您可以设置此方法来检查网址验证:

def valid_url?(url)
  url_regexp = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(:[0-9]{1,5})?(\/.*)?$/ix
  url =~ url_regexp ? true : false
end

使用它:

valid_url?("http://stackoverflow.com/questions/1805761/check-if-url-is-valid-ruby")

使用错误的网址进行测试:

  • http://ruby3arabi - 结果无效
  • http://http://ruby3arabi.com - 结果无效
  • http:// - 结果无效

使用正确的网址进行测试:

  • http://ruby3arabi.com - 结果有效
  • http://www.ruby3arabi.com - 结果有效
  • https://www.ruby3arabi.com - 结果有效
  • https://www.ruby3arabi.com/article/1 - 结果有效
  • https://www.ruby3arabi.com/websites/58e212ff6d275e4bf9000000?locale=en - 结果有效

答案 6 :(得分:4)

一般来说,

/^#{URI::regexp}$/

效果很好,但如果您只想匹配httphttps,则可以将这些选项作为选项传递给该方法:

/^#{URI::regexp(%w(http https))}$/

如果你想拒绝像ftp://这样的协议,那么这种方法会更好一些。

答案 7 :(得分:3)

这有点旧,但这是我如何做到的。使用Ruby的URI模块来解析URL。如果可以解析它,那么它是一个有效的URL。 (但这并不意味着可以访问。)

URI支持许多方案,另外您可以自己添加自定义方案:

irb> uri = URI.parse "http://hello.it" rescue nil
=> #<URI::HTTP:0x10755c50 URL:http://hello.it>

irb> uri.instance_values
=> {"fragment"=>nil,
 "registry"=>nil,
 "scheme"=>"http",
 "query"=>nil,
 "port"=>80,
 "path"=>"",
 "host"=>"hello.it",
 "password"=>nil,
 "user"=>nil,
 "opaque"=>nil}

irb> uri = URI.parse "http:||bra.ziz" rescue nil
=> nil


irb> uri = URI.parse "ssh://hello.it:5888" rescue nil
=> #<URI::Generic:0x105fe938 URL:ssh://hello.it:5888>
[26] pry(main)> uri.instance_values
=> {"fragment"=>nil,
 "registry"=>nil,
 "scheme"=>"ssh",
 "query"=>nil,
 "port"=>5888,
 "path"=>"",
 "host"=>"hello.it",
 "password"=>nil,
 "user"=>nil,
 "opaque"=>nil}

有关URI模块的详细信息,请参阅the documentation

答案 8 :(得分:-2)

你也可以使用正则表达式,也许类似于http://www.geekzilla.co.uk/View2D3B0109-C1B2-4B4E-BFFD-E8088CBC85FD.htm,假设这个正则表达式是正确的(我还没有完全检查它),下面将显示网址的有效性。

url_regex = Regexp.new("((https?|ftp|file):((//)|(\\\\))+[\w\d:\#@%/;$()~_?\+-=\\\\.&]*)")

urls = [
    "http://hello.it",
    "http:||bra.ziz"
]

urls.each { |url|
    if url =~ url_regex then
        puts "%s is valid" % url
    else
        puts "%s not valid" % url
    end
}

以上示例输出:

http://hello.it is valid
http:||bra.ziz not valid