从字符串 (Ruby) 中提取 URL(正则表达式和 link 缩短)

Extract URLs from String (Ruby) (Regex and link shortened)

我听说 URI::extract() 只有 returns link 带有 :,但是因为我正在抓取一条推文,它不包含 [=13] =],我相信我必须使用正则表达式。我需要检查 "swoo.sh/whatever" link,并将其存储到一个变量中。但是,关于我必须维护 / 之后的所有内容,我怎么能找到第一个(它显然 returns 自动),"swoo.sh/whatever" link。例如,如果推文说

Lorem ipsum lorem ipsum swoo.sh/12xfsW lorem ipsum

我如何获取 swoo.sh link 以及 / 之后的所有不同内容?

这是一种使用 match 的方法:

match = /(\w+\.\w+\/\w+)/.match("Lorem ipsum lorem ipsum swoo.sh/12xfsW lorem ipsum")
if match
    puts match[1]
else
    puts "no match"
end

Demo

如果您还需要同时捕获完整 URL 的能力,那么我的答案就必须更新。这只会回答您的直接问题。

我们可以利用 URI 不能包含 space 和 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" 看起来像一个缩短的 link,但在上下文中它可能是 "my neighbor threw a baseball through my window so i yanked the hubcabs off his car.net gain!!!",显然它只是一个缺失的 space.