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