2010-12-31 18 views
6

Recibo mis últimos tweets con HTTParty y Hashie como tal.Convierta las URL y @ * en los enlaces

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

Quiero ser capaz de convertir todos los eslabones (http://*.*) y nombres de usuario (@.) en enlaces. ¿Cuál sería la expresión regular de ambos y cómo lo implementaría?

+0

Esto no es una solución, pero asegúrese de mirar las entidades de tweet en el documento: Twitter hará todo este trabajo por usted con anticipación. http://developer.twitter.com/pages/tweet_entities –

Respuesta

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) 

Esto funciona, siempre y cuando las direcciones URL se rellenan por espacios o están al principio y/o al final del tweet.

+0

Funciona perfectamente, gracias. –

+0

Si la publicación tiene un signo de interrogación, este código es infinito para mí en ruby ​​1.87. Intente alimentar: s = "Snif http://www.youtube.com/watch?v=V7676EC06oc&feature=related" – Joelio

+0

Puede que no sea la mejor opción, pero agregué/cambié la sección s = ~ a: match_name = name.gsub ("?", "\\?") match_name = match_name.gsub ("&", "\\ &") s.sub!/(| ^) http: \/\/# {match_name} (| $) /, "#{name}" – Joelio

0

Puede probar esto:

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

La expresión regular para la url no es perfecto, pero lo suficientemente bueno para los más comunes.

1

Este proyecto tiene un método para ello: https://github.com/mzsanford/twitter-text-rb

Desde sus documentos:

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

Para encontrar las direcciones URL en el texto, ¿por qué no volver a utilizar una rueda existente en lugar de inventar una nueva?

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" 

Agregue eso a la respuesta dada por @stef y listo.

0

Ampliando la respuesta del Hombre de hojalata, hay un simple trazador de líneas para hacer clic en las URL.

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

A continuación, es necesario utilizar body.html_safe si en Rails. Para los usuarios de Twitter, realmente deberías confiar en la API de Twitter para decirte qué es y qué no es un nombre de usuario válido, porque pueden filtrar correctamente "@looksvalid" cuando no hay ningún usuario con ese nombre.

Cuestiones relacionadas