Je me demandais comment valider au mieux les URL dans Rails. Je pensais utiliser une expression régulière, mais je ne suis pas sûr que ce soit la meilleure pratique.
Et, si je devais utiliser une regex, quelqu'un pourrait-il m'en suggérer une? Je suis encore nouveau sur Regex.
Réponses:
La validation d'une URL est une tâche délicate. C'est aussi une demande très large.
Que voulez-vous faire exactement? Voulez-vous valider le format de l'URL, l'existence ou quoi? Il existe plusieurs possibilités, selon ce que vous souhaitez faire.
Une expression régulière peut valider le format de l'URL. Mais même une expression régulière complexe ne peut garantir que vous avez affaire à une URL valide.
Par exemple, si vous prenez une expression régulière simple, elle rejettera probablement l'hôte suivant
mais cela permettra
c'est un hôte valide, mais pas un domaine valide si vous considérez les TLD existants. En effet, la solution fonctionnerait si vous souhaitez valider le nom d'hôte, pas le domaine car le suivant est un nom d'hôte valide
ainsi que le suivant
Maintenant, laissez-moi vous donner quelques solutions.
Si vous souhaitez valider un domaine, vous devez oublier les expressions régulières. La meilleure solution disponible pour le moment est la Public Suffix List, une liste maintenue par Mozilla. J'ai créé une bibliothèque Ruby pour analyser et valider les domaines par rapport à la liste de suffixes publics, et elle s'appelle PublicSuffix .
Si vous souhaitez valider le format d'un URI / URL, vous pouvez utiliser des expressions régulières. Au lieu d'en rechercher un, utilisez la
URI.parse
méthode Ruby intégrée .Vous pouvez même décider de le rendre plus restrictif. Par exemple, si vous souhaitez que l'URL soit une URL HTTP / HTTPS, vous pouvez rendre la validation plus précise.
Bien sûr, il existe des tonnes d'améliorations que vous pouvez appliquer à cette méthode, notamment la vérification d'un chemin ou d'un schéma.
Enfin, vous pouvez également regrouper ce code dans un validateur:
la source
URI::HTTPS
pour https uris (ex:URI.parse("https://yo.com").class => URI::HTTPS
URI::HTTPS
hérite deURI:HTTP
, c'est la raison pour laquelle j'utilisekind_of?
.URI.parse('http://invalid-host.foo')
renvoie true car cet URI est une URL valide. Notez également qu'il.foo
s'agit désormais d'un TLD valide. iana.org/domains/root/db/foo.htmlJ'utilise une doublure à l'intérieur de mes modèles:
validates :url, format: URI::regexp(%w[http https])
Je pense que c'est assez bon et simple à utiliser. De plus, elle devrait être théoriquement équivalente à la méthode de Simone, car elle utilise la même expression rationnelle en interne.
la source
'http://'
au modèle ci-dessus. Voir:URI::regexp(%w(http https)) =~ 'http://'
http:fake
sera également valide.Suivant l'idée de Simone, vous pouvez facilement créer votre propre validateur.
puis utilisez
dans votre modèle.
la source
URI("http:").kind_of?(URI::HTTP) #=> true
Il existe également une gemme validate_url (qui n'est qu'un bon wrapper pour la
Addressable::URI.parse
solution).Il suffit d'ajouter
à votre
Gemfile
, puis dans les modèles, vous pouvezla source
Cette question a déjà une réponse, mais bon sang, je propose la solution que j'utilise.
L'expression régulière fonctionne bien avec toutes les URL que j'ai rencontrées. La méthode setter est de faire attention si aucun protocole n'est mentionné (supposons http: //).
Et enfin, nous essayons de récupérer la page. Peut-être que je devrais accepter les redirections et pas seulement HTTP 200 OK.
et...
la source
Vous pouvez également essayer le gem valid_url qui autorise les URL sans le schéma, vérifie la zone de domaine et les noms d'hôte IP.
Ajoutez-le à votre Gemfile:
gem 'valid_url'
Et puis en modèle:
la source
Juste mes 2 cents:
EDIT: modification de l'expression régulière pour correspondre aux URL des paramètres.
la source
http://test.com/fdsfsdf?a=b
La solution qui a fonctionné pour moi était:
J'ai essayé d'utiliser certains des exemples que vous avez joints, mais je soutiens l'URL comme ceci:
Notez l'utilisation de A et Z car si vous utilisez ^ et $ vous verrez cet avertissement de sécurité des validateurs Rails.
la source
"https://portal.example.com/portal/#"
. Dans Ruby 2.1.6, l'évaluation se bloque.J'ai rencontré le même problème ces derniers temps (je devais valider les URL dans une application Rails) mais j'ai dû faire face à l'exigence supplémentaire d'urls unicode (par exemple
http://кц.рф
) ...J'ai recherché quelques solutions et suis tombé sur les suivantes:
URI.parse
. Consultez la réponse de Simone Carletti pour plus de détails. Cela fonctionne bien, mais pas pour les URL Unicode.URI.parse
mais en utilisant leaddressable
gem au lieu de laURI
stdlib. Cette approche est détaillée ici: http://rawsyntax.com/blog/url-validation-in-rails-3-and-ruby-in-general/la source
Addressable::URI.parse('http:///').scheme # => "http"
ouAddressable::URI.parse('Съешь [же] ещё этих мягких французских булок да выпей чаю')
sont parfaitement ok du point de vue d'Voici une version mise à jour du validateur publiée par David James . Il a été publié par Benjamin Fleischer . Pendant ce temps, j'ai poussé une fourchette mise à jour qui peut être trouvée ici .
...
Veuillez noter qu'il existe encore des URI HTTP étranges qui sont analysés comme des adresses valides.
Voici un numéro pour la
addressable
gemme qui couvre les exemples.la source
J'utilise une légère variation sur la solution lafeber ci-dessus . Il interdit les points consécutifs dans le nom d'hôte (comme par exemple dans
www.many...dots.com
):URI.parse
semble imposer un préfixe de schéma, ce qui dans certains cas n'est pas ce que vous voudrez peut-être (par exemple, si vous souhaitez permettre à vos utilisateurs d'épeler rapidement des URL dans des formulaires tels quetwitter.com/username
)la source
J'utilise le bijou « activevalidators » et il est fonctionne assez bien ( et pas seulement pour la validation urls)
vous pouvez le trouver ici
Tout est documenté, mais une fois la gemme ajoutée, vous voudrez ajouter les quelques lignes suivantes dans un initialiseur, par exemple: /config/environments/initializers/active_validators_activation.rb
(Remarque: vous pouvez remplacer: all par: url ou: peu importe si vous souhaitez simplement valider des types de valeurs spécifiques)
Et puis de retour dans votre modèle quelque chose comme ça
Redémarrez maintenant le serveur et ça devrait être tout
la source
Si vous souhaitez une validation simple et un message d'erreur personnalisé:
la source
Vous pouvez valider plusieurs URL en utilisant quelque chose comme:
la source
https://github.com/perfectline/validates_url est un joyau simple et agréable qui fera à peu près tout pour vous
la source
Récemment, j'ai eu ce même problème et j'ai trouvé un moyen de contourner les URL valides.
La première partie de la méthode validate_url suffit à valider le format de l'url. La deuxième partie s'assurera que l'URL existe en envoyant une requête.
la source
J'ai aimé monkeypatch le module URI pour ajouter le valide? méthode
à l'intérieur
config/initializers/uri.rb
la source
Et en tant que module
Et puis juste
include UrlValidator
dans n'importe quel modèle pour lequel vous souhaitez valider les URL. Juste y compris pour les options.la source
La validation d'URL ne peut pas être gérée simplement en utilisant une expression régulière car le nombre de sites Web ne cesse de croître et de nouveaux schémas de dénomination de domaine continuent à apparaître.
Dans mon cas, j'écris simplement un validateur personnalisé qui vérifie une réponse réussie.
Je valide l'
path
attribut de mon modèle en utilisantrecord.path
. Je pousse également l'erreur vers le nom d'attribut respectif en utilisantrecord.errors[:path]
.Vous pouvez simplement le remplacer par n'importe quel nom d'attribut.
Ensuite, j'appelle simplement le validateur personnalisé dans mon modèle.
la source
Vous pouvez utiliser regex pour cela, pour moi fonctionne bien celui-ci:
la source