我正在使用HTTParty和Hashie获取最新的推文。
tweet = Hashie::Mash.new HTTParty.get(http://twitter.com/statuses/user_timeline/ethnt.json).first
puts tweet.text
我希望能够将每个链接(http://*.*
)和用户名(@.
)转换为链接。这两者的正则表达式是什么,以及我将如何实现它?
答案 0 :(得分:4)
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}", "<a href='http://twitter.com/#{$1}' >#{$1}</a>"
end
#replace urls with links
while s =~ url
name = $2
s.sub! /( |^)http:\/\/#{name}( |$)/, " <a href='http://#{name}' >#{name}</a> "
end
s
end
puts link_urls_and_users(tweet.text)
只要URL被空格填充或位于推文的开头和/或结尾,这就有效。
答案 1 :(得分:2)
为了在文本中查找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给出的答案中,您就完成了。
答案 2 :(得分:1)
这个项目有一个方法: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
答案 3 :(得分:0)
你可以试试这个:
# Arrays
links = []
usernames = []
links = tweet.text.scan(/(http:\/\/\w+(\.?\w+(:\d+)?\/?)+)/i).map{|e| e[0]}
usernames = tweet.text.scan(/@(\w+)/i).map{|e| "<a href='http://twitter.com/#{e[0]}'>@#{e[0]}</a>"}
网址的正则表达式并不完美,但对于普通网址来说已经足够了。
答案 4 :(得分:0)
扩展Tin Man的答案,有一个简单的衬垫可以使URL可点击。
URI::extract(body).each { |uri| body.gsub!(uri, %Q{<a href="#{uri}">#{uri}</a>})}
如果在Rails中,您需要使用body.html_safe
。对于Twitter用户,您应该依靠Twitter API来告诉您什么是有效的用户名,因为他们可以在没有该用户名的用户时正确过滤掉“@looksvalid”。