2010-10-02 1 views
13

J'essaye d'analyser un URI de l'entrée d'utilisateur. Je suppose que certains utilisateurs ne mettront pas le schéma dans leurs URI et je veux par défaut "http".Comment est-ce que je peux placer le schéma à un objet d'URI dans Ruby

Le code suivant ne fonctionne pas:

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 

-je voir "http://www.google.com" mais je reçois "http: www.google.com". Est-il même possible de le faire de cette façon?

Si oui, qu'est-ce qui me manque?

Y a-t-il une meilleure façon de procéder?

Répondre

14

Les barres obliques (//) indiquent que l'URL est une adresse IP et sont nécessaires pour marquer le nom d'hôte afin que l'URI puisse les analyser correctement.

Wikipedia a quelques bons aperçus et des exemples d'utilisation:

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

La meilleure information est dans la spécification elle-même. http://www.ietf.org/rfc/rfc1738.txt en particulier dans la section 3.1 « 3.1 Schéma commun Internet Syntaxe ".

Vous pouvez envisager d'utiliser la gemme adressable. C'est plus intelligent et c'est ce que j'utilise quand j'ai besoin de faire beaucoup d'analyse ou de manipulation d'URI.

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

+8

+1. Pour votre cas particulier, vous pouvez regarder 'Addressable :: URI.heuristic_parse', qui est * spécifiquement * destiné au cas, où certaines informations sont vraiment manquantes dans l'URI plutôt qu'éliminées intentionnellement. –

+0

Addressable :: URI.heuristic_parse est exactement ce que je cherche. Je vous remercie! – maz

+0

D'accord ... ce que le Tin Man dit est vrai, mais pour le cas d'utilisation du monde réel (ou du moins, ce à quoi la question se réfère spécifiquement), 'Addressable :: URI.heuristic_parse' est ce qui est nécessaire. – hlascelles

4

Lorsque la chaîne que vous voulez à analyser ne conatin pas un régime, URI ne reconnaît pas comme nom d'hôte:

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 

Lorsque vous définissez le schéma comme vous le faites dans votre exemple et appelez to_s l'URI est construit sans l'hôte ...

Vous pouvez essayer quelque chose comme ce qui suit: (C'est un hack, je ne connais pas les détails 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

Merci! Correction de l'exemple. Un petit problème de copier/coller;) – maz

+0

Cela ne fonctionnera pas pour les URI qui ont un chemin. Vous pourriez probablement juste ré-analyser le schéma. –

Questions connexes