将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”。