从不包含"http"的字符串中提取URL

tob*_*b88 4 ruby ruby-on-rails ruby-on-rails-3

我有以下3个字符串......

a = "The URL is www.google.com"
b = "The URL is google.com"
c = "The URL is http://www.google.com"
Run Code Online (Sandbox Code Playgroud)

Ruby的URI提取方法只返回第三个字符串中的URL,因为它包含http部分.

URI.extract(a)
=> []

URI.extract(b)
=> []

URI.extract(c)
=> ["http://www.google.com"]
Run Code Online (Sandbox Code Playgroud)

如何在所有3个实例中创建检测和返回URL的方法?

Suc*_*oir 11

使用正则表达式:

这是一个适用于大多数情况的基本方法:

/(https?:\/\/)?\w*\.\w+(\.\w+)*(\/\w+)*(\.\w*)?/.match( a ).to_s
Run Code Online (Sandbox Code Playgroud)

这只会获取字符串中的第一个url并返回一个字符串.


thr*_*onk 7

这个问题没有完美的解决方案:它充满了边缘情况.但是,您可以使用Twitter使用正则表达式从推文中提取URL来获得足够好的结果(剥离额外的前导空格留作练习!):

require './regex.rb'

def extract_url(s)
  s[Twitter::Regex[:valid_url]]
end

a = "The URL is www.google.com"
b = "The URL is google.com"
c = "The URL is http://www.google.com"

extract_url(a)
# => " www.google.com"
extract_url(b)
# => " google.com"
extract_url(c)
# => " http://www.google.com"
Run Code Online (Sandbox Code Playgroud)