2010-08-23 8 views
9

Ich habe diese URL in meiner Datenbank, in dem „Standort“ Feld:URL-String-Parameter abrufen?

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

ich es mit @object.location bekommen kann, aber wie kann ich den Wert von v bekommen? Ich meine, erhalten "xxxxxxxxxxxx" aus der URL-Zeichenfolge?

Antwort

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

Beachten Sie, dass die Rückkehr von CGI.parse ist ein Hash von Strings-Arrays, so dass es mehrere Werte für den gleichen Parameternamen umgehen kann. Für Ihr Beispiel möchten Sie uri_params['v'][0].

Beachten Sie auch, dass die Hash zurück von CGI.parse kehrt [], wenn der angeforderte Schlüssel nicht gefunden, deshalb uri_params['v'][0] zurückkehren wird entweder den Wert oder nil, wenn die URL nicht v Parameter enthielt.

+2

Sie müssen 'net/http' nicht laden, um auf das URI-Parsing zugreifen zu können. Nur 'verlangen 'uri'' stattdessen. –

+0

Danke @theTinMan - Ich habe die Antwort aktualisiert. – 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

Das ist, was ich versucht habe zu denken. Ich habe in URI :: HTTP gesucht und konnte keine Methoden zum Parsen der Parameter finden. – AboutRuby

0

über eine Bibliothek die gesamte URL in Protokoll, Host-Namen, Pfad und Parameter zu analysieren, können Sie eine einfache Regexp verwenden, um die Informationen zu extrahieren. Beachten Sie, dass es sich bei regexp um eine schnelle und unreine Lösung handelt, die fehlschlägt, wenn die URL anders aussieht, als ob sie nach dem v-Parameter einen anderen Parameter hätte.

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

Sie können weiter mit dem, was Sie getan haben, indem Sie URI :: Parse verwenden, um die Abfrage Informationen zu erhalten.

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