如何检查URL是否有效

Luc*_*oli 91 ruby

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

例如:

http://hello.it => yes
http:||bra.ziz, => no
Run Code Online (Sandbox Code Playgroud)

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

Mik*_*l S 172

使用URI随Ruby分发的模块:

require 'uri'

if url =~ URI::regexp
    # Correct URL
end
Run Code Online (Sandbox Code Playgroud)

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

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

url =~ /\A#{URI::regexp}\z/
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这似乎不起作用:''http://:5984/asdf'= ~URI :: regexp`和`'http :: 5984/asdf'= ~URI :: regexp`都返回0.我期待它们返回nil,因为它们都不是有效的URI. (23认同)
  • 不要使用它,"http:"`通过这个正则表达式是如此糟糕. (11认同)
  • 不是:本地主机上的5984端口5984? (4认同)
  • 它实际上检查变量是否包含有效的URL.它将接受"http:// example com"作为有效的URL.因为它包含一个.但如果你期望整个事情都是URL,那就无济于事. (3认同)
  • gotqn:根据RFC 1738,这不是有效的URL. (2认同)
  • 关于Ruby在多行字符串上处理`^`和`$`,这不应该是`/\A#{URI :: regexp}\z /`吗? (2认同)
  • 不要使用:此问题存在一个错误,并且已记录了 9 年多,验证不是此正则表达式的目的:https://bugs.ruby-lang.org/issues/6520 (2认同)

小智 42

与上面的答案类似,我发现使用此正则表达式稍微更准确:

URI::DEFAULT_PARSER.regexp[:ABS_URI]
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 如果你计划在任何时候使用URI.parse,这绝对是你要走的路.URI :: regexp匹配稍后使用URI.parse时将失败的某些URL.谢谢你的提示. (3认同)
  • 将awendt的评论应用于您的提案:`'http://:5984/asdf'= ~URI :: DEFAULT_PARSER.regexp [:ABS_URI]`给出0,而不是nil; `'http :: 5984/asdf'= ~URI :: DEFAULT_PARSER.regexp [:ABS_URI]`给出0; `'http://:5984/asdf'=〜/ ^#{URI.regexp} $ /`给出0; `'http :: 5984/asdf'=〜/ ^#{URI.regexp} $ /`也给出了0.以上regexp都不是完全正确的,但是它们仅在非常奇怪的情况下失败,并且在大多数情况下这不是什么大问题. (3认同)

fot*_*nus 32

当前答案的问题是URI不是URL.

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

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

 "urn:isbn:0451450523" =~ URI::regexp
 => 0 
Run Code Online (Sandbox Code Playgroud)

话虽如此,据我所知,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
Run Code Online (Sandbox Code Playgroud)

  • 第一次编辑,希望我帮助并且是合适的:P (2认同)
  • `uri.kind_of?(URI::HTTP)` 似乎对两种情况(http 和 https)都足够了,至少在 ruby​​ 1.9.3 中是这样。 (2认同)
  • 总结一下,`URI.parse(string_to_be_checked).kind_of?(URI::HTTP)` 可以很好地完成这项工作。 (2认同)

Dav*_* J. 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
Run Code Online (Sandbox Code Playgroud)

  • 我只是用最奇怪的字符串提供了Addressable :: URI.parse()来查看它拒绝的内容.它接受了疯狂的东西.然而,它不接受的第一个字符串是":-)".嗯. (3认同)

Wil*_*och 10

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

String.class_eval do
    def is_valid_url?
        uri = URI.parse self
        uri.kind_of? URI::HTTP
    rescue URI::InvalidURIError
        false
    end
end
Run Code Online (Sandbox Code Playgroud)

现在你可以这样做:

if "http://www.omg.wtf".is_valid_url?
    p "huzzah!"
end
Run Code Online (Sandbox Code Playgroud)

  • 这比上述解决方案好**.它没有上面列出的警告,也不接受像javascript:alert('spam')这样的uris. (2认同)
  • 但它也匹配`http:/`,这可能不是你想要的. (2认同)

Kom*_* K. 8

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

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

选项:

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

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

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
Run Code Online (Sandbox Code Playgroud)

要使用它:

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

使用错误的网址测试:

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