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

时间:2013-07-05 13:01:28

标签: ruby-on-rails ruby 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"

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

URI.extract(a)
=> []

URI.extract(b)
=> []

URI.extract(c)
=> ["http://www.google.com"]

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

5 个答案:

答案 0 :(得分:9)

使用正则表达式:

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

/(https?:\/\/)?\w*\.\w+(\.\w+)*(\/\w+)*(\.\w*)?/.match( a ).to_s

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

答案 1 :(得分:7)

这个问题没有完美的解决方案:它充满了边缘情况。但是,您可以使用类似regular expressions used by Twitter to extract URLs from tweets之类的东西获得足够好的结果(剥去额外的前导空格作为练习!):

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"

答案 2 :(得分:1)

你似乎对Sucrenoir的回答感到满意。 Sucrenoir的答案的本质是通过假设它包含至少一个句点来识别URL。如果是这样的话,Sucrenoir的正则表达式可以简化(不等同于,但大多数情况下):

string[/\S+\.\S+/]

答案 3 :(得分:0)

这是我前一段时间使用的东西,希望它有所帮助

validates :url, :format =>
        { :with => URI::regexp(%w(http https)), :message => "Not Valid URL" }

通过验证(我假设您使用数据库)

答案 4 :(得分:0)

尝试使用此方法。希望它对你有用

def get_url(str)
    arr = str.split(' ')
    url = nil
    arr.map {|arr_str| url = arr_str if arr_str.include?('.com')}
    url
  end

这是你的例子

get_url("The URL is www.google.com") #=> www.google.com
get_url("The URL is google.com") #=> google.com
get_url("The URL is http://www.google.com") #=> http://www.google.com