我的数据库中有这个URL,位于“location”字段中:
http://www.youtube.com/watch?v=xxxxxxxxxxxxxxxxxxx
我可以使用@object.location
获取它,但是如何获得v
的值?我的意思是,从URL字符串中获取"xxxxxxxxxxxx"
?
答案 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
Strings
到Arrays
,因此它可以处理相同参数名称的多个值。对于您的示例,您需要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']