有一些关于使用正则表达式链接文本的帖子.最受欢迎的
is this post.
不过我的规格有点棘手:
- 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
任何想法如何实现毛茸茸的正则表达式:
这是我到目前为止的地方(它未通过2次测试):
- def gsub_links!(input)
- regex = /https?\:\/\/[\-\w+&@#\/%?=~\(\)\|!:,.;]*[\-\w+&@#\/%=~_\(\)|]/
- input.gsub!(regex) { |link|
- yield link
- }
- end
解决方法
我可能会错过一些背景,但为什么重新发明轮子?你在actionpack中尝试过auto_link吗?
- $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"