如何检查字符串是否为有效的URL?
例如:
http://hello.it => yes
http:||bra.ziz, => no
如果这是一个有效的网址,我如何检查这是否与图像文件相关?
答案 0 :(得分:164)
使用随Ruby分发的URI
模块:
require 'uri'
if url =~ URI::regexp
# Correct URL
end
与AlexanderGünther在评论中说,它检查字符串是否包含一个URL。
要检查字符串是是否为网址,请使用:
url =~ /\A#{URI::regexp}\z/
如果您只想查看网址(http
或https
),请使用以下网址:
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}$/
效果很好,但如果您只想匹配http
或https
,则可以将这些选项作为选项传递给该方法:
/^#{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