Ruby linkify для URL-адресов в строках
Было несколько сообщений о связывании текста с помощью регулярного выражения. Самым популярнымявляется этот пост .
Однако моя спецификация немного сложнее:
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
1 ответ:
Возможно, я упускаю какой-то контекст, но зачем заново изобретать колесо? Вы пробовали
auto_linkв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"