Как извлечь URL из текста

Как извлечь все URL-адреса из обычного текстового файла в Ruby?

Я попробовал несколько библиотек, но в некоторых случаях они терпят неудачу. Какой лучший способ?

Ответы

Ответ 1

В каких случаях происходит сбой?

В соответствии с библиотекой regexpert вы можете использовать

regexp = /(^$)|(^(http|https):\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}(([0-9]{1,5})?\/.*)?$)/ix

а затем выполните текст scan в тексте.

EDIT: Кажется, что regexp поддерживает пустую строку. Просто удалите начальную (^$) и вы закончите

Ответ 3

Я использовал twitter-text gem

require "twitter-text"
class UrlParser
    include Twitter::Extractor
end

urls = UrlParser.new.extract_urls("http://stackoverflow.com")
puts urls.inspect

Ответ 4

Вы можете использовать регулярное выражение и .scan()

string.scan(/(https?:\/\/([-\w\.]+)+(:\d+)?(\/([\w\/_\.]*(\?\S+)?)?)?)/)

Вы можете начать работу с этим регулярным выражением и настроить его в соответствии с вашими потребностями.

Ответ 5

require 'uri'    
foo = #<URI::HTTP:0x007f91c76ebad0 URL:http://foobar/00u0u_gKHnmtWe0Jk_600x450.jpg>
foo.to_s
=> "http://foobar/00u0u_gKHnmtWe0Jk_600x450.jpg"

изменить: объяснение

Для тех, кто испытывает проблемы с разбором URI через ответы JSON или с помощью инструмента скребки, такого как Nokogiri или Mechanize, это решение сработало для меня.

Ответ 6

Если ваш ввод выглядит примерно так:

"http://i.imgur.com/c31IkbM.gifv;http://i.imgur.com/c31IkbM.gifvhttp://i.imgur.com/c31IkbM.gifv"

то есть. URL-адреса необязательно имеют пробелы вокруг них, могут быть разделены каким-либо разделителем или вообще не имеют разделителя между ними, вы можете использовать следующий подход:

def process_images(raw_input)
  return [] if raw_input.nil?
  urls = raw_input.split('http')
  urls.shift
  urls.map { |url| "http#{url}".strip.split(/[\s\,\;]/)[0] }
end

Надеюсь, что это поможет!