Как я могу определить и обработать все URL в текстовой строке? - PullRequest
2 голосов
/ 23 января 2010

Я хотел бы перечислить все URL в текстовой строке, например:

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

Для каждого найденного URL я хочу вызвать функцию method(...), которая преобразует строку.

Сейчас я использую такой метод:

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

Это работает, но медленно для длинных строк. Как я могу ускорить это?

1 Ответ

1 голос
/ 23 января 2010

Я думаю, что "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

Если вам действительно нужен сверхбыстрый разбор длинных строк, вы должны создать расширение ruby ​​C с помощью ragel .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...