2009-07-30 5 views
1

J'ai une application Ruby analyse un tas d'URL à partir de chaînes:Regex pour supprimer le texte avant "http: //"?

@text = "a string with a url http://example.com" 

@text.split.grep(/http[s]?:\/\/\w/) 

@text[0] = "http://example.com" 

Cela fonctionne bien ^^

Mais parfois, les URL ont du texte avant le HTTP: // par exemple

Existe-t-il une regex qui peut sélectionner simplement le texte avant "http: //" dans une chaîne pour que je puisse le supprimer?

+1

Heads up, vous allez avoir la même question à la fin de l'URL aussi, et ce sera beaucoup plus difficile à traiter. – JohnFx

+0

Oui, je suis d'accord avec JohnFx. Regex n'est pas si bon pour ce problème. Les URL correspondantes dans les chaînes ont déjà été demandées sur SO. Jetez un coup d'oeil et voyez quelles solutions ils ont utilisées - c.-à-d. Quelles bibliothèques etc. – Pod

Répondre

6

Spliting puis grep est une drôle de façon de faire ce. Pourquoi ne pas simplement utiliser String#scan:

@text = "a string with a url http://example.com" 
urls = @text.scan(/http[s]?:\/\/\S+/) 
url[0] # => "http://example.com" 
+0

Merci, cela a résolu mon problème - il ignore tout ce qui précède le texte correspondant. – dMix

0

ou vous pouvez combiner les deux.

.*(?=(f|ht)tp[s]://) 
0

Il suffit de chercher http: //, puis retirez les parties de la chaîne avant que (comme = ~ retourne le décalage dans la chaîne)

10

Peut-être une plus belle façon d'obtenir le même résultat est d'utiliser la bibliothèque standard URI.

require 'uri' 
text = "a string with a url http://example.com and another URL here:http://2.example.com and this here" 
URI.extract(text, ['http', 'https']) 
# => ["http://example.com", "http://2.example.com"] 

Documentation: URI.extract

Questions connexes