2010-12-31 7 views
6

Ich bekomme meine neuesten Tweets mit HTTParty und Hashie so.Verwandle URLs und @ * in Links

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

Ich möchte jeden Link (http://*.*) und Benutzernamen (@.) in Links in der Lage sein zu drehen. Was wäre die Regex für diese beiden und wie würde ich sie umsetzen?

+0

Dies ist keine Lösung, aber achten Sie darauf, die Tweet-Entitäten im Dokument zu sehen - Twitter wird all diese Arbeit für Sie im Voraus erledigen. http://developer.twitter.com/pages/tweet_entities –

Antwort

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) 

Das funktioniert, solange URLs durch Leerzeichen aufgefüllt werden oder sind am Anfang und/oder am Ende des tweet.

+0

Funktioniert perfekt, danke. –

+0

Wenn das Posting ein Fragezeichen enthält, läuft dieser Code für mich in Ruby 1.87. Versuchen Sie, füttern: s = "Snif http://www.youtube.com/watch?v=V7676EC06oc&feature=related" – Joelio

+0

Vielleicht nicht die beste Option, aber ich hinzugefügt/geändert den Abschnitt s = ~ zu: match_name = name.gsub ("?", "\\?") match_name = match_name.gsub ("&", "\\ &") s |/(| ^) http: \/\/# {Übereinstimmungsname} (| $) /, "#{name}" – Joelio

0

Sie können dies versuchen:

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

Die Regex für die URL ist nicht perfekt, aber gut genug für den allgemeinen.

1

Dieses Projekt hat eine Methode dafür: https://github.com/mzsanford/twitter-text-rb

Aus ihrer docs:

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

Für URLs in Text zu finden, warum nicht ein bestehendes Rad wiederverwenden, anstatt einen neuen erfinden?

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" 

Fügen Sie das zu der Antwort hinzu, die von @stef gegeben wird, und Sie sind fertig.

0

Erweiternd auf Tin Mans Antwort gibt es einen einfachen Liner, um URLs anklickbar zu machen.

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

Sie werden dann brauchen body.html_safe zu verwenden, wenn in Rails. Für die Twitter-Benutzer sollten Sie sich wirklich auf die Twitter-API verlassen, um Ihnen mitzuteilen, was ein gültiger Benutzername ist und was nicht, weil sie "@looksvalid" korrekt ausfiltern können, wenn kein Benutzer mit diesem Namen existiert.

Verwandte Themen