2009-07-30 8 views
5

Ho una stringa piuttosto semplice che voglio analizzare in ruby ​​e provare a trovare la soluzione più elegante. La stringa è formato /xyz/mov/exdaf/daeed.mov?arg1=blabla & arg2 = 3bla3blaParsing stringa URL in Ruby

Quello che vorrei avere è: string1: /xyz/mov/exdaf/daeed.mov string2: arg1 = blabla & arg2 = 3bla3bla

in modo fondamentalmente su tokenise?

ma non riesco a trovare un buon esempio. Qualsiasi aiuto sarebbe apprezzato.

risposta

10

Dividi la stringa iniziale sui punti interrogativi.

str.split("?") 
=> ["/xyz/mov/exdaf/daeed.mov", "arg1=blabla&arg2=3bla3bla"] 
+3

C'è già una libreria di analisi degli URL che probabilmente sarebbe una scelta migliore se l'input è sempre un URL. –

6

Questo sembra essere quello che stai cercando, stringhe built-in funzione split:

"abc?def".split("?") => ["abc", "def"] 

Edit: Bah, a rallentare;)

10

penso che la soluzione migliore sarebbe utilizzare il modulo URI. (È possibile fare cose come URI.parse('your_uri_string').query per ottenere la parte a destra del ?.) Vedi http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/

Esempio:

002:0> require 'uri' # or even 'net/http' 
true 
003:0> URI 
URI 
004:0> URI.parse('/xyz/mov/exdaf/daeed.mov?arg1=bla&arg2=asdf') 
#<URI::Generic:0xb7c0a190 URL:/xyz/mov/exdaf/daeed.mov?arg1=bla&arg2=asdf> 
005:0> URI.parse('/xyz/mov/exdaf/daeed.mov?arg1=bla&arg2=asdf').query 
"arg1=bla&arg2=asdf" 
006:0> URI.parse('/xyz/mov/exdaf/daeed.mov?arg1=bla&arg2=asdf').path 
"/xyz/mov/exdaf/daeed.mov" 

In caso contrario, è possibile catturare in una regex: /^(.*?)\?(.*?)$/. Quindi $1 e $2 sono ciò che desideri. (URI però ha più senso in questo caso)

+0

Si potrebbe semplicemente richiedere 'uri' invece di 'net/http' –

+0

Buon punto; Mi dimentico sempre di questo perché di solito scarico qualcosa subito dopo aver analizzato un URI. –