从String(Ruby)中提取URL(正则表达式和链接缩短)

时间:2018-05-09 01:48:08

标签: ruby regex uri

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

  

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

我如何抓住swoo.sh链接以及/之后直接出现的所有不同内容?

2 个答案:

答案 0 :(得分:1)

以下是使用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

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

答案 1 :(得分:1)

我们可以使用URI不能包含空格的事实,而Ruby有this document这几乎可以解析任何看起来像URI的东西。然后我们只需要过滤掉非web-URI,我假设每个Web 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>]

由于含糊不清,这一般无法正常工作。 &#34; car.net&#34;看起来像是一个缩短的链接,但在上下文中它可能是&#34;我的邻居在我的窗户上扔了一个棒球,所以我把他们的车载的轮毂罩从他的车网上拿走!!!&#34;,它显然在那里只是一个缺失的空间。