将URL和@ *转换为链接

时间:2010-12-31 16:48:07

标签: ruby regex

我正在使用HTTParty和Hashie获取最新的推文。

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

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

5 个答案:

答案 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”。