2010-12-31 12 views
6

Dostaję moje najnowsze tweety z HTTParty i Hashie.Zamień adresy URL i @ * na linki

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

Chcę być w stanie zamienić każdy link (http://*.*) oraz nazw użytkowników (@.) do linków. Jaki byłby regex dla obu z nich i jak go zaimplementować?

+0

To nie jest rozwiązanie, ale pamiętaj, aby przyjrzeć się jednostkom Tweet w dokumencie - Twitter zrobi to wszystko z wyprzedzeniem. http://developer.twitter.com/pages/tweet_entities –

Odpowiedz

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) 

To działa, tak długo, jak adresy URL są wypełniane spacjami lub są na początku i/lub po zakończeniu tweet.

+0

Działa idealnie, dzięki. –

+0

Jeśli w postingu znajduje się znak zapytania, ten kod jest nieskończony dla mnie w rubiu 1.87. Spróbuj karmienia: s = "Snif http://www.youtube.com/watch?v=V7676EC06oc&feature=related" – Joelio

+0

Może nie być najlepszą opcją, ale dodałem/zmieniłem sekcję s = ~ na: match_name = name.gsub ("?", "\\?") match_name = match_name.gsub ("&", "\\ &") s.sub!/(| ^) http: \/\/# {match_name} (| $) /, "#{name}" – Joelio

0

Można spróbować to:

# 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>"} 

regex adresu URL nie jest idealny, ale wystarczająco dobre dla spotykane.

1

Ten projekt ma sposobu na to: https://github.com/mzsanford/twitter-text-rb

Z ich dokumentów:

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

do znajdowania adresów URL w tekście, dlaczego nie ponownie wykorzystać istniejący koło zamiast wymyślać nowe?

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" 

Dodaj to do odpowiedzi podanej przez @stef i gotowe.

0

Po rozwinięciu odpowiedzi Tin Mana istnieje prosta linka do klikania adresów URL.

URI::extract(body).each { |uri| body.gsub!(uri, %Q{<a href="#{uri}">#{uri}</a>})} 

Będziesz wtedy musiał użyć body.html_safe, jeśli w Rails. W przypadku użytkowników Twittera powinieneś polegać na API Twittera, aby powiedzieć Ci, co jest i nie jest prawidłową nazwą użytkownika, ponieważ mogą poprawnie odfiltrować "@oxoksvalid", gdy nie ma użytkownika o tej nazwie.