2009-07-30 9 views
5

J'ai une chaîne assez simple que je veux analyser dans ruby ​​et essayer de trouver la solution la plus élégante. La chaîne est le format /xyz/mov/exdaf/daeed.mov?arg1=blabla & arg2 = 3bla3blaAnalyser une chaîne URL dans Ruby

Ce que je voudrais avoir est: chaine1: /xyz/mov/exdaf/daeed.mov string2: arg1 = blabla & arg2 = 3bla3bla

donc essentiellement tokenise sur?

mais ne peut pas trouver un bon exemple. Toute aide serait appréciée.

Répondre

10

Fractionnez la chaîne initiale sur les points d'interrogation.

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

Il existe déjà une bibliothèque d'analyse d'URL qui serait probablement un meilleur choix si l'entrée est toujours une URL. –

6

Cela semble être ce que vous êtes à la recherche de, chaînes intégrées en fonction split:

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

Modifier: Bah, pour ralentir;)

10

Je pense que la meilleure solution être d'utiliser le module URI. (Vous pouvez faire des choses comme URI.parse('your_uri_string').query pour obtenir la partie à droite de la ?.) Voir http://www.ruby-doc.org/stdlib/libdoc/uri/rdoc/

Exemple:

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" 

Sinon, vous pouvez capturer sur une regex: /^(.*?)\?(.*?)$/. Puis $1 et $2 sont ce que vous voulez. (URI a cependant plus de sens dans ce cas.)

+0

Vous pourriez juste exiger 'uri' au lieu de 'net/http' –

+0

Bon point; J'oublie toujours cela parce que je télécharge habituellement quelque chose juste après avoir analysé une URI. –

Questions connexes