如何识别和处理文本字符串中的所有URL?

时间:2010-01-23 14:11:47

标签: ruby-on-rails ruby

我想枚举文本字符串中的所有网址,例如:

text = "fasòls http://george.it sdafsda"

对于找到的每个网址,我想调用一个转换字符串的函数method(...)

现在我正在使用这样的方法:

msg = ""
for i in text.split
  if (i =~ URI::regexp).nil?
        msg += " " + i
      else 
         msg+= " " + method(i)
  end
end
text = msg

这有效,但对于长字符串来说速度很慢。我怎样才能加快速度呢?

1 个答案:

答案 0 :(得分:1)

我认为“gsub”是你的朋友:

class UrlParser
  attr_accessor :text, :url_counter, :urls

  def initialize(text)
    @text = parse(text)
  end

  private
    def parse(text)
      @counter = 0
      @urls = []
      text.gsub(%r{(\A|\s+)(http://[^\s]+)}) do
        @urls << $2
        "#{$1}#{replace_url($2)}"
      end
    end

    def replace_url(url)
      @counter += 1
      "[#{@counter}]"
    end
end

parsed_url = UrlParser.new("one http://x.com/url two")
puts parsed_url.text
puts parsed_url.urls

如果您确实需要对长字符串进行额外快速解析,则应使用ragel构建ruby C扩展。