2010-10-02 1 views
13

Я пытаюсь разобрать URI с пользовательского ввода. Я предполагаю, что некоторые пользователи не будут помещать эту схему в свои URI, и я хочу по умолчанию «http».Как настроить схему на объект URI в Ruby

Следующий код не работает:

require 'uri' 

uri_to_check = URI::parse("www.google.com") 
uri_to_check.scheme = "http" unless uri_to_check.scheme 

puts uri_to_check.to_s 

я ожидал увидеть "http://www.google.com", но я получаю "HTTP: www.google.com". Возможно ли это сделать так?

Если да, то что мне не хватает?

Есть ли лучший способ сделать это?

ответ

14

Ведущие косые черты (//) указывают, что URL-адрес является IP-адресом и необходимы для обозначения имени хоста, чтобы URI мог правильно их разобрать.

В Википедии есть некоторые хорошие обзоры и примеры использования:

http://en.wikipedia.org/wiki/Url, http://en.wikipedia.org/wiki/URI_scheme, http://en.wikipedia.org/wiki/URL_normalization

Лучшая информация находится в самой спецификации:. http://www.ietf.org/rfc/rfc1738.txt особенно в разделе 3.1 «3.1 Общие Интернет Схема Синтаксис ».

Возможно, вам захочется использовать адресный жемчуг. Это умнее, и это то, что я использую, когда мне нужно много анализировать или манипулировать URI.

http://addressable.rubyforge.org/ и http://addressable.rubyforge.org/api/Addressable/URI.html

+8

+1. В вашем конкретном случае использования вы можете посмотреть «Addressable :: URI.heuristic_parse», который специально предназначен для данного случая, где некоторая информация действительно отсутствует в URI, а не намеренно отсутствует. –

+0

Addressable :: URI.heuristic_parse - именно то, что я ищу. Спасибо! – maz

+0

Согласовано. Что говорит оловянный человек, правда, но для случая использования в реальном мире (или, по крайней мере, того, о чем конкретно идет речь), «Addressable :: URI.heuristic_parse» - это то, что нужно. – hlascelles

4

Когда строка, которую вы хотите быть разобраны не conatin схемы, URI не признает его как имя хоста:

irb(main):001:0> require 'uri' 
=> true 
irb(main):002:0> uri = URI::parse("www.google.com") 
=> #<URI::Generic:0x11cfc88 URL:www.google.com> 
irb(main):003:0> uri.path 
=> "www.google.com" 
irb(main):004:0> uri.host 
=> nil 

При настройке схемы, как вы в вашем примере, а затем называют to_s URI, строится без хозяина ...

Вы можете попробовать что-то вроде следующего: (это быстрый хак, я не знаю URI подробнее ...)

uri = URI::parse("www.google.com") 
if uri.scheme.nil? && uri.host.nil? 
    unless uri.path.nil? 
    uri.scheme = "http" 
    uri.host = uri.path 
    uri.path = "" 
    end 
end 

puts uri.to_s 
+0

Спасибо! Исправлен пример. Небольшая копия/вставка.) – maz

+0

Это не будет работать для URI, у которых есть путь. Возможно, вы могли бы просто пересмотреть схему. –