Получить параметры строки URL?

У меня есть этот URL в моей базе данных, в поле« location »:

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

Я могу получить его с @ object.location , но как я могу получить значение v ? Я имею в виду, получить "xxxxxxxxxxxx" из строки URL?

9
задан the Tin Man 18 July 2012 в 22:01
поделиться

3 ответа

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 .

21
ответ дан 4 December 2019 в 10:02
поделиться

Помимо использования библиотеки для анализа всего 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']
0
ответ дан 4 December 2019 в 10:02
поделиться
$ 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
0
ответ дан 4 December 2019 в 10:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: