108 votes

vérifier si l'url est valide ruby

Comment puis-je vérifier si une chaîne est une url valide?

Par exemple:

http://hello.it => yes
http:||bra.ziz, => no

et si c'est une url valide comment puis-je vérifier si c'est par rapport à un fichier image?

merci

192voto

Mikael S Points 2973

Utiliser l' URI module distribué avec Ruby:

require 'uri'

if url =~ URI::regexp
    # Correct URL
end

MODIFIER

Comme Alexander Günther dit dans les commentaires, il vérifie si une chaîne contient une URL.

Pour vérifier si la chaîne est une URL, utilisez:

url =~ /\A#{URI::regexp}\z/

EDIT 2

Si vous voulez seulement vérifier les Url de sites web (http ou https), utilisez ceci:

url =~ /\A#{URI::regexp(['http', 'https'])}\z/

47voto

jonuts Points 226

Semblables à des réponses ci-dessus, je trouve l'utilisation de ce regex pour être un peu plus précis:

URI::DEFAULT_PARSER.regexp[:ABS_URI]

Qui va invalider les url avec des espaces, par opposition à l' URI.regexp qui permet d'espaces pour une raison quelconque.

modifier

J'ai récemment trouvé un raccourci qui est prévu pour les différentes URI rgexps. Vous pouvez accéder URI::DEFAULT_PARSER.regexp.keys directement à partir de URI::#{key}.

Par exemple, l' :ABS_URI regexp peut être consulté à partir de URI::ABS_URI.

43voto

fotanus Points 6322

Le problème avec le courant des réponses est qu' une URI n'est pas une URL.

Un URI peut être classé comme un repère, un nom, ou les deux. L' terme "Uniform Resource Locator" (URL) désigne le sous-ensemble d'Uri qui, en plus d'identifier des ressources, de fournir des moyens de la localisation de la ressource en décrivant son principal mécanisme d'accès (par exemple, son réseau "emplacement").

Depuis les Url sont un sous-ensemble d'Uri, il est clair que la correspondance spécifiquement pour les Uri avec succès en match indésirables valeurs. Par exemple, les Urnes:

 "urn:isbn:0451450523" =~ URI::regexp
 => 0 

Cela étant dit, autant que je sache, Ruby n'est pas un défaut pour analyser les Url , de sorte que vous aurez très probablement besoin d'un joyau de le faire. Si vous avez besoin de faire correspondre les Url plus précisément à l'adresse HTTP ou HTTPS format, vous pourriez faire quelque chose comme ceci:

uri = URI.parse(my_possible_url)
if uri.kind_of?(URI::HTTP) or uri.kind_of?(URI::HTTPS)
  # do your stuff
end

19voto

David James Points 8344

Je préfère le Adressable gem. J'ai trouvé qu'il gère l'Url de manière plus intelligente.

require 'addressable/uri'

SCHEMES = %w(http https)

def valid_url?(url)
  parsed = Addressable::URI.parse(url) or return false
  SCHEMES.include?(parsed.scheme)
rescue Addressable::URI::InvalidURIError
  false
end

12voto

Wilhelm Murdoch Points 860

C'est un assez vieux, mais j'ai pensé que je devais aller de l'avant et de contribuer:

String.class_eval do
    def is_valid_url?
        uri = URI.parse self
        uri.kind_of? URI::HTTP
    rescue URI::InvalidURIError
        false
    end
end

Maintenant, vous pouvez faire quelque chose comme:

if "http://www.omg.wtf".is_valid_url?
    p "huzzah!"
end

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X