Мы можем использовать тот факт, что URI не могут содержать пробелы, а Ruby имеет URI :: Generic , который будет анализировать почти все, что выглядит как URI. Тогда нам просто нужно отфильтровать не-веб-URI, что я делаю, предполагая, что каждый веб-URI должен начинаться с чего-то вроде foo.bar
require 'uri'
require 'pathname'
tweet.
split.
map { |s| URI.parse(s) rescue nil }.
select { |u| u && (u.hostname || Pathname(u.path).each_filename.first =~ /\w\.\w/) }
Пример вывода
tweet = 'foo . < google.com bar swoosh.sh/blah?q=bar http://google.com/bar'
# the above returns
# [#<URI::Generic google.com>, #<URI::Generic swoosh.sh/blah?q=bar>, #<URI::HTTP http://google.com/bar>]
Это не может работать вообще из-за двусмысленности. «car.net» выглядит как укороченная ссылка, но в контексте это может быть «мой сосед бросил бейсбольный мяч через мое окно, поэтому я выдернул колпаки из его выигрыша car.net !!!», где это явно просто пропущенное место.