获取URL字符串参数?

时间:2010-08-23 22:35:17

标签: ruby-on-rails ruby url

我的数据库中有这个URL,位于“location”字段中:

http://www.youtube.com/watch?v=xxxxxxxxxxxxxxxxxxx

我可以使用@object.location获取它,但是如何获得v的值?我的意思是,从URL字符串中获取"xxxxxxxxxxxx"

3 个答案:

答案 0 :(得分:21)

require 'uri'
require 'cgi'

# use URI.parse to parse the URL into its constituent parts - host, port, query string..
uri = URI.parse(@object.location)
# then use CGI.parse to parse the query string into a hash of names and values
uri_params = CGI.parse(uri.query)

uri_params['v'] # => ["xxxxxxxxxxxxxxxxxxx"]

请注意,CGI.parse的返回值为Hash StringsArrays,因此它可以处理相同参数名称的多个值。对于您的示例,您需要uri_params['v'][0]

另请注意,如果找不到请求的密钥,Hash返回的CGI.parse将返回[],因此uri_params['v'][0]将返回值或nil如果网址不包含v参数。

答案 1 :(得分:0)

$ irb

irb(main):001:0> require 'cgi' => true
irb(main):002:0> test = CGI::parse('v=xxxxxxxxxxxxxxxxxxx') => {"v"=>["xxxxxxxxxxxxxxxxxxx"]}
irb(main):003:0> puts test['v']
xxxxxxxxxxxxxxxxxxx
=> nil

答案 2 :(得分:0)

除了使用库将整个URL解析为协议,主机名,路径和参数之外,您还可以使用简单的正则表达式来提取信息。请注意,regexp是一个快速而肮脏的解决方案,如果URL有任何不同之处,它就会失败,就好像它在v参数后面有另一个参数一样。

url = 'http://www.youtube.com/watch?v=xxxxxxxxxxxxxxxxxxx'
video_id = url.match(/\?v=(.+)$/)[1]

您可以通过使用URI :: parse获取查询信息,进一步完成您的工作。

url = 'http://www.youtube.com/watch?v=xxxxxxxxxxxxxxxxxxx'
video_id = CGI::parse(URI::parse(url).query)['v']