在Ruby中提取字符串中的所有URL

我有一些文本内容,其中包含一个URL列表。

我试图抓住所有的URL并将它们放在一个数组中。

我有这个代码

content = "Here is the list of URLs: http://www.google.com http://www.google.com/index.html" urls = content.scan(/^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[az]{2,5}(([0-9]{1,5})?\/.*)?$/ix) 

我试图得到最终结果:

 ['http://www.google.com', 'http://www.google.com/index.html'] 

上面的代码似乎没有正常工作。 有谁知道我做错了什么?

谢谢

一种不同的方法,从完美的是好的敌人的思想流派:

 urls = content.split(/\s+/).find_all { |u| u =~ /^https?:/ } 

简单:

 ruby-1.9.2-p136 :006 > require 'uri' ruby-1.9.2-p136 :006 > URI.extract(content, ['http', 'https']) => ["http://www.google.com", "http://www.google.com/index.html"] 

我没有检查你的正则表达式的语法,但String.scan将生成一个数组,其中每个成员都是由你的正则表达式匹配的组的数组。 所以我希望结果如下:

[['http', '.google.com'], ...]

如果你想要你给出的格式,你需要不匹配的组/(?:stuff)/

编辑(看正则表达式):另外,你的正则表达式确实看起来有点不对劲。 您不需要开始和结束锚点( ^$ ),因为您不希望匹配位于content开头和结尾。 其次,如果你([0-9]{1,5})? 我试图捕获一个端口号,我想你错过了一个冒号来将域与端口分开。

玩完后进一步编辑:我想你想要这样的东西:

 content = "Here is the list of URLs: http://www.google.com http://www.google.com/index.html http://example.com:3000/foo" urls = content.scan(/(?:http|https):\/\/[a-z0-9]+(?:[\-\.]{1}[a-z0-9]+)*\.[az]{2,5}(?:(?::[0-9]{1,5})?\/[^\s]*)?/ix) # => ["http://www.google.com", "http://www.google.com/index.html", "http://example.com:3000/foo"] 

…但请注意,它与纯IP地址URL(如http://127.0.0.1 )不匹配,因为TLD的[az]{2,5}

只是为了你的兴趣:

Ruby有一个URI模块,它有一个正则表达式来实现这样的事情:

 require "uri" uris_you_want_to_grap = ['ftp','http','https','ftp','mailto','see'] html_string.scan(URI.regexp(uris_you_want_to_grap)) do |*matches| urls << $& end 

有关更多信息,请访问Ruby Ref: URI