2009-07-30 11 views
5

Tengo una cadena bastante simple que quiero analizar en ruby ​​y tratar de encontrar la solución más elegante. La cadena es de formato /xyz/mov/exdaf/daeed.mov?arg1=blabla & arg2 = 3bla3blaCadena URL de análisis en Ruby

Lo que me gustaría tener es: cadena1: /xyz/mov/exdaf/daeed.mov string2: arg1 = blabla & arg2 = 3bla3bla

así que básicamente tokenise on?

pero no puede encontrar un buen ejemplo. Cualquier ayuda sería apreciada.

Respuesta

10

Divida la cadena inicial en signos de interrogación.

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

Ya existe una biblioteca de análisis de URL que probablemente sea una mejor opción si la entrada es siempre una URL. –

6

Esto parece ser lo que usted está buscando, cuerdas incorporadas en función de división:

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

Editar: Bah, para frenar;)

10

Creo que la mejor solución sería utilizar el módulo URI. (Se puede hacer cosas como URI.parse('your_uri_string').query para obtener la parte de la derecha de la ?.) Ver http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/

Ejemplo:

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" 

De lo contrario, se puede capturar en una expresión regular: /^(.*?)\?(.*?)$/. Entonces $1 y $2 son lo que quieres. (URI tiene más sentido en este caso).

+0

Puede solicitar 'uri' en lugar de 'net/http' –

+0

Buen punto; Siempre me olvido de eso porque normalmente descargo algo justo después de analizar un URI. –