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

Rai*_*Son 6 ruby regex 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]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$/ix)
Run Code Online (Sandbox Code Playgroud)

我试图得到最终结果:

['http://www.google.com', 'http://www.google.com/index.html']
Run Code Online (Sandbox Code Playgroud)

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

谢谢

bal*_*alu 46

简单:

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"] 
Run Code Online (Sandbox Code Playgroud)

  • 为什么这没有标记为正确答案。grml (2认同)
  • 这应该被标记为答案。更加优雅。 (2认同)

Cho*_*ett 5

我没有检查你的正则表达式的语法,但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]+)*\.[a-z]{2,5}(?:(?::[0-9]{1,5})?\/[^\s]*)?/ix)
# => ["http://www.google.com", "http://www.google.com/index.html", "http://example.com:3000/foo"]
Run Code Online (Sandbox Code Playgroud)

...但请注意http://127.0.0.1,由于[a-z]{2,5}TLD的原因,它与纯IP地址URL(例如)不匹配.


FMc*_*FMc 5

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

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