2009-09-18 27 views
6

Đã có một số bài đăng về việc liên kết văn bản bằng cách sử dụng regex. Phổ biến nhất is this post.Ruby liên kết cho các url trong chuỗi

Tuy nhiên spec của tôi là một chút khó khăn hơn:

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 

Bất kỳ ý tưởng làm thế nào để thực hiện các Regex lông:

Đây là nơi mà tôi cho đến nay (nó không thành công 2 bài kiểm tra):

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

Trả lời

13

Tôi có thể thiếu một số ngữ cảnh, nhưng tại sao lại phát minh ra bánh xe? Bạn đã thử auto_link trong số actionpack chưa?

$ 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, liên kết tự động dường như vượt qua tất cả các thử nghiệm của tôi ... cảm ơn vì đã chỉ ra –

+0

lý do tại sao nó có thể không hoạt động trong ứng dụng? Tôi nhận được lỗi "số tệp đối số sai (2 cho 1): vị trí tag_helper.rb: tag_options line: 113" trong khi cố gắng thực hiện điều đó. Nó hoạt động hoàn hảo trong giao diện điều khiển mặc dù – Arty

+3

'auto_link' đã biến mất khỏi Rails kể từ 3.1. Xem http://stackoverflow.com/questions/6418710/replacing-the-auto-link-method-in-ruby-on-rails-3-1 để có câu trả lời cập nhật. – Thilo

Các vấn đề liên quan