2009-09-18 22 views
6

Ha habido algunas publicaciones sobre la vinculación de texto usando una expresión regular. El más popular is this post.Ruby linkify para urls en cadenas

Sin embargo mi especificación es un poco más complicado:

describe TextFormatter do 

    def l(input) 
    TextFormatter.gsub_links!(input){|link| "!!#{link}!!"} 
    end 

    it "should detect simple links" do 
    l("http://www.cnn.com").should == "!!http://www.cnn.com!!" 
    end 

    it "should detect multi links" do 
    l("http://www.cnn.com http://boats.com?help.asp").should == "!!http://www.cnn.com!! !!http://boats.com?help.asp!!" 
    end 

    it "should compensate for parans properly" do 
    l("(http://this.is?hello_world)").should == "(!!http://this.is?hello_world!!)" 
    end 

    it "should ignore existing links" do 
    s = "<A HREF='http://sam.com'> http://sam.com </A>" 
    l(s.dup).should == s 
    end 

    it "should allow parans" do 
    l("http://sam.com.au?(red)").should == "!!http://sam.com.au?(red)!!" 
    end 

end 

Alguna idea de cómo poner en práctica la expresión regular peluda:

Aquí es donde estoy tan lejos (falla 2 pruebas):

def gsub_links!(input) 
    regex = /https?\:\/\/[\-\w+&@#\/%?=~\(\)\|!:,.;]*[\-\w+&@#\/%=~_\(\)|]/ 
    input.gsub!(regex) { |link| 
     yield link 
    } 
    end 

Respuesta

13

Me puede faltar algo de contexto, pero ¿por qué reinventar la rueda? ¿Has probado auto_link en actionpack?

$ gem install actionpack 

$ irb -f --prompt simple 
>> require 'action_view' 
>> include ActionView::Helpers 

>> auto_link("abc http://google.com xyz") 
=> "abc <a href=\"http://google.com\">http://google.com</a> xyz" 
>> auto_link("abc <a href='http://google.com'>google</a> xyz") 
=> "abc <a href='http://google.com'>google</a> xyz" 
+0

Yerp, enlace automático parece pasar todas mis pruebas ... gracias por señalarlo –

+0

por las que podría no funcionar en aplicación? Recibo un error "número incorrecto de argumentos (2 por 1) file: tag_helper.rb location: tag_options línea: 113" al intentar hacer eso. Funciona perfectamente en la consola aunque – Arty

+3

'auto_link' se ha ido de Rails desde 3.1. Consulte http://stackoverflow.com/questions/6418710/replacing-the-auto-link-method-in-ruby-on-rails-3-1 para obtener una respuesta actualizada. – Thilo