2010-08-23 58 views
9

tengo esta URL en mi base de datos, en el campo "localización":¿Obtener los parámetros de cadena de URL?

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

puedo conseguirlo con @object.location, pero ¿cómo puedo obtener el valor de v? Quiero decir, obtener "xxxxxxxxxxxx" de la cadena URL?

Respuesta

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"] 

Tenga en cuenta que el regreso de CGI.parse es un Hash de Strings-Arrays para que pueda manejar múltiples valores para el mismo nombre de parámetro. Para su ejemplo, querría uri_params['v'][0].

También tenga en cuenta que el Hash devuelto por CGI.parse volverá [] si no se encuentra la clave solicitada, por lo tanto, uri_params['v'][0] devolverá o bien el valor o nil si la URL no contiene un parámetro v.

+2

No necesita cargar 'net/http' para obtener acceso al análisis de URI. Simplemente 'requiere' uri'' en su lugar. –

+0

Gracias @theTinMan - He actualizado la respuesta. – mikej

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 
+0

Eso es lo que estaba tratando de pensar. Estaba buscando en URI :: HTTP y no pude encontrar ningún método para analizar los parámetros. – AboutRuby

0

Más allá de utilizar una biblioteca para analizar toda la URL en el protocolo, el nombre de host, la ruta y los parámetros, se puede usar una expresión regular sencilla para extraer la información. Tenga en cuenta que la expresión regular es una solución rápida y sucia, y fallará si hay algo diferente en la URL, como si tuviera otro parámetro después del parámetro v.

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

Puede ir más allá con lo que hizo mediante el uso de URI :: Analizar para obtener la información solicitada.

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