Ich habe mich gefragt, wie ich URLs in Rails am besten validieren kann. Ich habe überlegt, einen regulären Ausdruck zu verwenden, bin mir aber nicht sicher, ob dies die beste Vorgehensweise ist.
Und wenn ich einen regulären Ausdruck verwenden würde, könnte mir jemand einen vorschlagen? Ich bin noch neu bei Regex.
Antworten:
Das Überprüfen einer URL ist eine schwierige Aufgabe. Es ist auch eine sehr breite Anfrage.
Was genau möchten Sie tun? Möchten Sie das Format der URL, die Existenz oder was überprüfen? Es gibt verschiedene Möglichkeiten, je nachdem, was Sie tun möchten.
Ein regulärer Ausdruck kann das Format der URL überprüfen. Aber selbst ein komplexer regulärer Ausdruck kann nicht sicherstellen, dass es sich um eine gültige URL handelt.
Wenn Sie beispielsweise einen einfachen regulären Ausdruck verwenden, wird der folgende Host wahrscheinlich abgelehnt
aber es wird erlauben
Dies ist ein gültiger Host, aber keine gültige Domäne, wenn Sie die vorhandenen TLDs berücksichtigen. In der Tat würde die Lösung funktionieren, wenn Sie den Hostnamen und nicht die Domäne überprüfen möchten, da der folgende ein gültiger Hostname ist
sowie die folgende
Lassen Sie mich Ihnen nun einige Lösungen geben.
Wenn Sie eine Domain validieren möchten, müssen Sie reguläre Ausdrücke vergessen. Die derzeit beste verfügbare Lösung ist die Public Suffix List, eine Liste, die von Mozilla verwaltet wird. Ich habe eine Ruby-Bibliothek erstellt, um Domänen anhand der öffentlichen Suffix-Liste zu analysieren und zu validieren. Sie heißt PublicSuffix .
Wenn Sie das Format eines URI / einer URL überprüfen möchten, möchten Sie möglicherweise reguläre Ausdrücke verwenden. Verwenden Sie die integrierte Ruby-
URI.parse
Methode, anstatt nach einer zu suchen .Sie können sogar entscheiden, es restriktiver zu gestalten. Wenn Sie beispielsweise möchten, dass die URL eine HTTP / HTTPS-URL ist, können Sie die Validierung genauer gestalten.
Natürlich gibt es unzählige Verbesserungen, die Sie auf diese Methode anwenden können, einschließlich der Suche nach einem Pfad oder einem Schema.
Zu guter Letzt können Sie diesen Code auch in einen Validator packen:
quelle
URI::HTTPS
für https uris sein wird (Beispiel:URI.parse("https://yo.com").class => URI::HTTPS
URI::HTTPS
erbt vonURI:HTTP
, das ist der Grund, warum ich benutzekind_of?
.URI.parse('http://invalid-host.foo')
Gibt true zurück, da dieser URI eine gültige URL ist. Beachten Sie auch, dass dies.foo
jetzt eine gültige TLD ist. iana.org/domains/root/db/foo.htmlIch benutze einen Einzeiler in meinen Modellen:
validates :url, format: URI::regexp(%w[http https])
Ich denke, es ist gut genug und einfach zu bedienen. Darüber hinaus sollte es theoretisch der Simone-Methode entsprechen, da es intern denselben regulären Ausdruck verwendet.
quelle
'http://'
dem obigen Muster. Siehe:URI::regexp(%w(http https)) =~ 'http://'
http:fake
ist gültig.Nach Simones Idee können Sie ganz einfach Ihren eigenen Validator erstellen.
und dann verwenden
in Ihrem Modell.
quelle
URI("http:").kind_of?(URI::HTTP) #=> true
Es gibt auch validate_url gem (was nur ein netter Wrapper für ist
Addressable::URI.parse
Lösung ist).Einfach hinzufügen
zu Ihrem
Gemfile
, und dann in Modellen können Siequelle
Diese Frage ist bereits beantwortet, aber was solls, ich schlage die Lösung vor, die ich verwende.
Der reguläre Ausdruck funktioniert gut mit allen URLs, die ich getroffen habe. Die Setter-Methode besteht darin, darauf zu achten, dass kein Protokoll erwähnt wird (nehmen wir an, http: //).
Und schließlich versuchen wir, die Seite abzurufen. Vielleicht sollte ich Weiterleitungen akzeptieren und nicht nur HTTP 200 OK.
und...
quelle
Sie können auch valid_url ausprobieren gem das URLs ohne das Schema zulässt und die IP-Hostnamen überprüft.
Fügen Sie es Ihrem Gemfile hinzu:
gem 'valid_url'
Und dann im Modell:
quelle
Nur meine 2 Cent:
BEARBEITEN: Regex wurde geändert, um mit den Parameter-URLs übereinzustimmen.
quelle
http://test.com/fdsfsdf?a=b
Die Lösung, die für mich funktioniert hat, war:
Ich habe versucht, einige der von Ihnen angehängten Beispiele zu verwenden, aber ich unterstütze die URL wie folgt:
Beachten Sie die Verwendung von A und Z, da bei Verwendung von ^ und $ diese Warnsicherheit von Rails-Validatoren angezeigt wird.
quelle
"https://portal.example.com/portal/#"
. In Ruby 2.1.6 hängt die Auswertung.Ich bin in letzter Zeit auf dasselbe Problem gestoßen (ich musste URLs in einer Rails-App validieren), musste aber die zusätzlichen Anforderungen an Unicode-URLs (z
http://кц.рф
) ...Ich habe nach einigen Lösungen gesucht und bin auf Folgendes gestoßen:
URI.parse
. Überprüfen Sie die Antwort von Simone Carletti für Details. Dies funktioniert in Ordnung, aber nicht für Unicode-URLs.URI.parse
jedoch deraddressable
Edelstein anstelle derURI
stdlib verwendet wird. Dieser Ansatz wird hier detailliert beschrieben: http://rawsyntax.com/blog/url-validation-in-rails-3-and-ruby-in-general/quelle
Addressable::URI.parse('http:///').scheme # => "http"
oderAddressable::URI.parse('Съешь [же] ещё этих мягких французских булок да выпей чаю')
sind aus der Sicht von Addressable vollkommen inHier ist eine aktualisierte Version des Validators von David James . Es wurde von Benjamin Fleischer veröffentlicht . In der Zwischenzeit habe ich eine aktualisierte Gabel geschoben, die hier zu finden ist .
...
Bitte beachten Sie, dass es immer noch seltsame HTTP-URIs gibt, die als gültige Adressen analysiert werden.
Hier ist eine Ausgabe für den
addressable
Edelstein, die die Beispiele abdeckt.quelle
Ich verwende oben eine leichte Variation der Lafeber-Lösung . Aufeinanderfolgende Punkte im Hostnamen sind nicht zulässig (z. B. in
www.many...dots.com
):URI.parse
scheint Schema Vorfixierung zu beauftragen, die in einigen Fällen ist nicht das, was Sie wollen (zB wenn Sie möchten , dass Ihre Benutzer ermöglichen, schnell URLs in Formen wie buchstabieren könnentwitter.com/username
)quelle
Ich habe das Juwel 'activevalidators' verwendet und es funktioniert ziemlich gut (nicht nur für die Validierung von URLs).
Sie finden es hier
Es ist alles dokumentiert, aber im Grunde genommen möchten Sie nach dem Hinzufügen des Edelsteins die folgenden Zeilen in einen Initialisierer einfügen: /config/environments/initializers/active_validators_activation.rb
(Hinweis: Sie können Folgendes ersetzen: alle durch: url oder: was auch immer, wenn Sie nur bestimmte Wertetypen validieren möchten.)
Und dann zurück in Ihrem Modell so etwas
Jetzt Starten Sie den Server und das sollte es sein ,
quelle
Wenn Sie eine einfache Validierung und eine benutzerdefinierte Fehlermeldung wünschen:
quelle
Sie können mehrere URLs mit folgenden Methoden überprüfen:
quelle
https://github.com/perfectline/validates_url ist ein schönes und einfaches Juwel, das so ziemlich alles für Sie erledigt
quelle
Vor kurzem hatte ich das gleiche Problem und fand eine Lösung für gültige URLs.
Der erste Teil der validate_url-Methode reicht aus, um das URL-Format zu validieren. Im zweiten Teil wird durch Senden einer Anfrage sichergestellt, dass die URL vorhanden ist.
quelle
Ich wollte das URI-Modul monkeypatch, um das gültige hinzuzufügen? Methode
Innerhalb
config/initializers/uri.rb
quelle
Und als Modul
Und dann einfach
include UrlValidator
in jedem Modell, für das Sie URLs validieren möchten. Nur für Optionen.quelle
Die URL-Validierung kann nicht einfach mithilfe eines regulären Ausdrucks durchgeführt werden, da die Anzahl der Websites weiter zunimmt und immer neue Domain-Namensschemata auftauchen.
In meinem Fall schreibe ich einfach einen benutzerdefinierten Validator, der nach einer erfolgreichen Antwort sucht.
Ich überprüfe das
path
Attribut meines Modells mithilfe vonrecord.path
. Ich schiebe den Fehler auch mit auf den jeweiligen Attributnamenrecord.errors[:path]
.Sie können dies einfach durch einen beliebigen Attributnamen ersetzen.
Dann rufe ich einfach den benutzerdefinierten Validator in meinem Modell auf.
quelle
Sie könnten Regex dafür verwenden, für mich funktioniert dieses gut:
quelle