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
http://invalid##host.com
aber es wird erlauben
http://invalid-host.foo
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
http://host.foo
sowie die folgende
http://localhost
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 .
require 'uri'
def valid_url?(uri)
uri = URI.parse(uri) && !uri.host.nil?
rescue URI::InvalidURIError
false
end
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.
require 'uri'
def valid_url?(url)
uri = URI.parse(url)
uri.is_a?(URI::HTTP) && !uri.host.nil?
rescue URI::InvalidURIError
false
end
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:
class HttpUrlValidator < ActiveModel::EachValidator
def self.compliant?(value)
uri = URI.parse(value)
uri.is_a?(URI::HTTP) && !uri.host.nil?
rescue URI::InvalidURIError
false
end
def validate_each(record, attribute, value)
unless value.present? && self.class.compliant?(value)
record.errors.add(attribute, "is not a valid HTTP URL")
end
end
end
# in the model
validates :example_attribute, http_url: true