我有一些文本内容,其中包含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)
我没有检查你的正则表达式的语法,但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(例如)不匹配.
一种不同的方法,从完美是好的敌人的思想流派:
urls = content.split(/\s+/).find_all { |u| u =~ /^https?:/ }
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9662 次 |
| 最近记录: |