Превратите URL и @ * в ссылки - PullRequest
6 голосов
/ 31 декабря 2010

Я получаю свои последние твиты с HTTParty и Hashie следующим образом.

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

Я хочу иметь возможность превращать каждую ссылку (http://*.*) и имена пользователей (@.) в ссылки.Каким будет регулярное выражение для обоих из них, и как бы я его реализовал?

Ответы [ 5 ]

4 голосов
/ 31 декабря 2010
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-адреса дополняются пробелами или находятся в начале и / или конце твита.

2 голосов
/ 31 декабря 2010

Для поиска URL-адресов в тексте, почему бы не использовать существующее колесо вместо того, чтобы изобретать новое?

require 'uri'
require 'open-uri'

body = open('/3568067/prevratite-url-i-v-ssylki').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, и все готово.

1 голос
/ 31 декабря 2010

Этот проект имеет метод для этого: 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
0 голосов
/ 15 октября 2013

Расширяя ответ «Жестяного человечка», есть простой вкладыш для того, чтобы сделать URL кликабельными.

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

Затем вам нужно будет использовать body.html_safe в Rails. Для пользователей Twitter вы должны полагаться на API-интерфейс Twitter, чтобы сообщать вам, что является и не является действительным именем пользователя, поскольку они могут правильно отфильтровывать "@looksvalid", когда пользователя с таким именем нет.

0 голосов
/ 31 декабря 2010

Вы можете попробовать это:

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

Регламент для URL не идеален, но достаточно хорош для обычных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...