2010-01-23 5 views
2

Je voudrais énumérer toutes les URL dans une chaîne de texte, par exemple:Comment puis-je identifier et traiter toutes les URL d'une chaîne de texte?

text = "fasòls http://george.it sdafsda" 

Pour chaque URL trouvé, je veux invoquer une fonction qui transforme la chaîne.

En ce moment je suis en utilisant une méthode comme ceci:

msg = "" 
for i in text.split 
    if (i =~ URI::regexp).nil? 
     msg += " " + i 
     else 
     msg+= " " + method(i) 
    end 
end 
text = msg 

Cela fonctionne, mais il est lent pour les longues chaînes. Comment puis-je accélérer cela?

+0

J'ai nettoyé un peu le texte et la langue, mais n'hésitez pas à revenir si ce n'est pas ce que vous recherchiez. –

Répondre

1

Je pense que « gsub » est votre ami ici:

class UrlParser 
    attr_accessor :text, :url_counter, :urls 

    def initialize(text) 
    @text = parse(text) 
    end 

    private 
    def parse(text) 
     @counter = 0 
     @urls = [] 
     text.gsub(%r{(\A|\s+)(http://[^\s]+)}) do 
     @urls << $2 
     "#{$1}#{replace_url($2)}" 
     end 
    end 

    def replace_url(url) 
     @counter += 1 
     "[#{@counter}]" 
    end 
end 

parsed_url = UrlParser.new("one http://x.com/url two") 
puts parsed_url.text 
puts parsed_url.urls 

Si vous avez vraiment besoin rapide analyse supplémentaire de chaînes longues, vous devez construire une extension C rubis avec ragel.

+0

s'il n'y a pas de retour de texte d'URL –

+0

Ouups, désolé, il y avait une faute de frappe. Ca devrait être "gsub", pas "gsub!" (et bien sûr, vous pourriez avoir besoin d'une URL regexp plus robuste). – gaspard

Questions connexes