У меня есть этот URL в моей базе данных, в поле« location »:
http://www.youtube.com/watch?v=xxxxxxxxxxxxxxxxxxx
Я могу получить его с @ object.location
, но как я могу получить значение v
? Я имею в виду, получить "xxxxxxxxxxxx"
из строки URL?
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
представляет собой хэш
из строк
в массивов
, чтобы он мог обрабатывать несколько значений для одного и того же имени параметра. В вашем примере вам понадобится uri_params ['v'] [0]
.
Также обратите внимание, что Hash
, возвращенный CGI.parse
, вернет []
, если запрошенный ключ не найден, поэтому uri_params ['v'] [0 ]
вернет либо значение, либо nil
, если URL-адрес не содержит параметр v
.
Помимо использования библиотеки для анализа всего URL-адреса на протокол, имя хоста, путь и параметры, вы можете использовать простое регулярное выражение для извлечения информации. Обратите внимание, что регулярное выражение - это быстрое и грязное решение, и оно не сработает, если в 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']
$ 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