将URL和@ *转换为链接

我正在收到HTTParty和Hashie的最新推文。

tweet = Hashie::Mash.new HTTParty.get(http://twitter.com/statuses/user_timeline/ethnt.json).first puts tweet.text 

我希望能够将每个链接( http://*.* )和用户名( @. )转换为链接。 两者的正则表达式是什么,以及我将如何实现它?

 def link_urls_and_users s #regexps url = /( |^)http:\/\/([^\s]*\.[^\s]*)( |$)/ user = /@(\w+)/ #replace @usernames with links to that user while s =~ user s.sub! "@#{$1}", "#{$1}" end #replace urls with links while s =~ url name = $2 s.sub! /( |^)http:\/\/#{name}( |$)/, " #{name} " end s end puts link_urls_and_users(tweet.text) 

只要URL被空格填充或位于推文的开头和/或结尾,这就有效。

为了在文本中查找URL,为什么不重用现有的轮子而不是发明新轮子?

 require 'uri' require 'open-uri' body = open('http://stackoverflow.com/questions/4571229/turn-urls-and-into-links').read uris = URI::extract(body) uris.size # => 102 uris.first # => "http://www.w3.org/TR/html4/strict.dtd" uris.last # => "http://edge.quantserve.com/quant.js" 

将其添加到@stef给出的答案中,您就完成了。

这个项目有一个方法: https : //github.com/mzsanford/twitter-text-rb

从他们的文档:

 class MyClass include Twitter::Extractor usernames = extract_mentioned_screen_names("Mentioning @twitter and @jack") # usernames = ["twitter", "jack"] end 

你可以试试这个:

 # Arrays links = [] usernames = [] links = tweet.text.scan(/(http:\/\/\w+(\.?\w+(:\d+)?\/?)+)/i).map{|e| e[0]} usernames = tweet.text.scan(/@(\w+)/i).map{|e| "@#{e[0]}"} 

url的正则表达式并不完美,但对于普通url来说已经足够了。

扩展了Tin Man的答案,有一个简单的衬垫可以使URL可点击。

 URI::extract(body).each { |uri| body.gsub!(uri, %Q{#{uri}})} 

然后,如果在Rails中,您需要使用body.html_safe 。 对于Twitter用户,您应该真正依赖Twitter API来告诉您什么是有效的用户名,因为他们可以在没有该用户名的用户时正确过滤掉“@looksvalid”。