5

我有以下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?

4

5 回答 5

11

使用正则表达式:

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

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

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

于 2013-07-05T13:26:10.723 回答
8

这个问题没有完美的解决方案:它充满了边缘情况。但是,使用 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"
于 2013-07-05T13:26:50.063 回答
1

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

string[/\S+\.\S+/]
于 2013-07-05T13:10:32.793 回答
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
于 2013-07-05T13:24:31.380 回答
0

这是我之前用过的东西,希望对你有帮助

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

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

于 2013-07-05T13:17:33.080 回答