如何检查一个URL是否有效

我如何检查一个string是否是一个有效的URL?

例如:

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

如果这是一个有效的URL我怎么能检查这是否相对于一个图像文件?

使用随Ruby发布的URI模块:

 require 'uri' if url =~ URI::regexp # Correct URL end 

就像AlexanderGünther在评论中所说,它会检查一个string是否包含一个URL。

要检查string是否是URL,请使用:

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

如果您只想检查url( httphttps ),请使用以下命令:

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

类似于上面的答案,我发现使用这个正则expression式稍微更准确:

 URI::DEFAULT_PARSER.regexp[:ABS_URI] 

这将使URL与空间无效,而URI.regexp允许空间出于某种原因。

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

例如,可以从URI::ABS_URI访问:ABS_URIexpression式。

当前答案的问题是一个URI不是一个URL 。

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

由于URL是URI的一个子集,因此很明显,特定于URI的匹配将成功匹配不需要的值。 例如, URN :

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

这就是说,据我所知,Ruby没有默认的方法来parsingURL,所以你很可能需要一个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 

我更喜欢可寻址的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 

这是一个相当古老的条目,但我想我会继续并贡献:

 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 

一般来说,

 /^#{URI::regexp}$/ 

会很好的工作,但是如果你只想匹配http或者https ,你可以把它们作为选项传递给方法:

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

如果你想拒绝像ftp://这样的协议,这样的话会更好一些。

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

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

 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模块的更多信息,请参阅文档 。

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

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

选项:

  • i – 大小写不敏感
  • x – 忽略正则expression式中的空格

您可以设置此方法来检查URLvalidation:

 def valid_url?(url) url_regexp = /^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{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") 

使用错误的URL进行testing:

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

使用正确的URL进行testing:

  • 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 – 结果有效

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

 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