【问题标题】:Extract all urls inside a string in Ruby在Ruby中提取字符串中的所有url
【发布时间】:2011-01-18 20:13:27
【问题描述】:

我有一些文本内容,其中包含 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)

我试图得到的最终结果是:

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

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

谢谢

【问题讨论】:

    标签: ruby regex url


    【解决方案1】:

    简单:

    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"] 
    

    【讨论】:

    • 这应该被标记为答案。更优雅。
    【解决方案2】:

    一种不同的方法,来自于完美的敌人的思想学派:

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

    【讨论】:

    • 我会给你简单的。这很可能就是所需要的。
    • 我从那所学校毕业了!
    • 这种方法会遗漏很多有效的网址,并错误地选择很多无效的网址。
    【解决方案3】:

    我没有检查你的正则表达式的语法,但是 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"]
    

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

    【讨论】:

      【解决方案4】:

      只是为了您的兴趣:

      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 参考:URI

      【讨论】:

        猜你喜欢
        • 2011-01-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-22
        相关资源
        最近更新 更多