Zastanawiałem się, jak najlepiej zweryfikować adresy URL w Railsach. Myślałem o użyciu wyrażenia regularnego, ale nie jestem pewien, czy to najlepsza praktyka.
A gdybym użył wyrażenia regularnego, czy ktoś mógłby mi go zasugerować? Nadal jestem nowy w Regex.
ruby-on-rails
ruby
regex
validation
url
sójka
źródło
źródło
Odpowiedzi:
Weryfikacja adresu URL to trudna praca. To także bardzo szeroka prośba.
Co dokładnie chcesz zrobić? Czy chcesz sprawdzić format adresu URL, istnienie czy co? Istnieje kilka możliwości, w zależności od tego, co chcesz zrobić.
Wyrażenie regularne może zweryfikować format adresu URL. Ale nawet złożone wyrażenie regularne nie może zapewnić, że masz do czynienia z prawidłowym adresem URL.
Na przykład, jeśli weźmiesz proste wyrażenie regularne, prawdopodobnie odrzuci ono następujący host
ale to pozwoli
to jest prawidłowy host, ale nie jest to prawidłowa domena, jeśli wziąć pod uwagę istniejące TLD. Rzeczywiście, rozwiązanie zadziałałoby, gdybyś chciał zweryfikować nazwę hosta, a nie domenę, ponieważ następująca jest prawidłową nazwą hosta
jak również następny
Pozwólcie, że przedstawię wam kilka rozwiązań.
Jeśli chcesz zweryfikować domenę, musisz zapomnieć o wyrażeniach regularnych. Najlepszym obecnie dostępnym rozwiązaniem jest Public Suffix List, lista utrzymywana przez Mozillę. Stworzyłem bibliotekę Ruby do analizowania i sprawdzania poprawności domen względem listy sufiksów publicznych i nazywa się PublicSuffix .
Jeśli chcesz sprawdzić poprawność formatu identyfikatora URI / adresu URL, możesz użyć wyrażeń regularnych. Zamiast szukać jednego, użyj wbudowanej
URI.parse
metody Ruby .Możesz nawet zdecydować, czy będzie bardziej restrykcyjny. Na przykład, jeśli chcesz, aby adres URL był adresem URL HTTP / HTTPS, możesz zwiększyć dokładność weryfikacji.
Oczywiście istnieje mnóstwo ulepszeń, które możesz zastosować w tej metodzie, w tym sprawdzenie ścieżki lub schematu.
Wreszcie, możesz również spakować ten kod do walidatora:
źródło
URI::HTTPS
dla https uris (np .:URI.parse("https://yo.com").class => URI::HTTPS
URI::HTTPS
dziedziczy poURI:HTTP
, dlatego używamkind_of?
.URI.parse('http://invalid-host.foo')
zwraca prawdę, ponieważ ten identyfikator URI jest prawidłowym adresem URL. Należy również pamiętać, że.foo
jest to teraz prawidłowa TLD. iana.org/domains/root/db/foo.htmlUżywam jednej wkładki wewnątrz moich modeli:
validates :url, format: URI::regexp(%w[http https])
Myślę, że jest wystarczająco dobry i prosty w użyciu. Ponadto powinno być teoretycznie równoważne metodzie Simone, ponieważ wewnętrznie używa tego samego wyrażenia regularnego.
źródło
'http://'
pasuje do powyższego wzorca. Zobacz:URI::regexp(%w(http https)) =~ 'http://'
http:fake
będzie ważny.Zgodnie z pomysłem Simone możesz łatwo stworzyć własny walidator.
a następnie użyj
w swoim modelu.
źródło
URI("http:").kind_of?(URI::HTTP) #=> true
Istnieje również gem validate_url (który jest po prostu ładnym opakowaniem
Addressable::URI.parse
rozwiązania).Poprostu dodaj
do twojego
Gemfile
, a potem w modelach możeszźródło
Na to pytanie mam już odpowiedź, ale co do cholery, proponuję rozwiązanie, którego używam.
Wyrażenie regularne działa dobrze ze wszystkimi adresami URL, które spotkałem. Metoda ustawiająca polega na zachowaniu ostrożności, jeśli żaden protokół nie jest wymieniony (załóżmy, że http: //).
Na koniec próbujemy pobrać stronę. Może powinienem akceptować przekierowania, a nie tylko HTTP 200 OK.
i...
źródło
Możesz także wypróbować gem valid_url, który zezwala na adresy URL bez schematu, sprawdza strefę domeny i nazwy hostów IP.
Dodaj go do swojego Gemfile:
gem 'valid_url'
A potem w modelu:
źródło
Tylko moje 2 centy:
EDYCJA: zmieniono wyrażenie regularne, aby pasowało do adresów URL parametrów.
źródło
http://test.com/fdsfsdf?a=b
Rozwiązanie, które działało dla mnie, to:
Próbowałem użyć jakiegoś przykładu, który dołączyłeś, ale obsługuję adres URL w następujący sposób:
Zwróć uwagę na użycie A i Z, ponieważ jeśli użyjesz ^ i $, zobaczysz ostrzeżenie od walidatorów Rails.
źródło
"https://portal.example.com/portal/#"
. W Rubim 2.1.6 ocena się zawiesza.Ostatnio napotkałem ten sam problem (musiałem zweryfikować adresy URL w aplikacji Rails), ale musiałem poradzić sobie z dodatkowym wymogiem adresów URL Unicode (np.
http://кц.рф
) ...Zbadałem kilka rozwiązań i znalazłem następujące:
URI.parse
. Sprawdź odpowiedź Simone Carletti, aby poznać szczegóły. Działa to dobrze, ale nie w przypadku adresów URL Unicode.URI.parse
ale używającymaddressable
gem zamiast standardowejURI
biblioteki. To podejście jest szczegółowo opisane tutaj: http://rawsyntax.com/blog/url-validation-in-rails-3-and-ruby-in-general/źródło
Addressable::URI.parse('http:///').scheme # => "http"
lubAddressable::URI.parse('Съешь [же] ещё этих мягких французских булок да выпей чаю')
są w porządku z punktu widzeniaOto zaktualizowana wersja walidatora opublikowana przez Davida Jamesa . Został opublikowany przez Benjamina Fleischera . W międzyczasie wcisnąłem zaktualizowany widelec, który można znaleźć tutaj .
...
Proszę zauważyć, że wciąż istnieją dziwne identyfikatory URI HTTP, które są analizowane jako prawidłowe adresy.
Oto kwestia
addressable
klejnotu, która obejmuje przykłady.źródło
Używam niewielkiej odmiany powyższego rozwiązania Lafeber . Zabrania kolejnych kropek w nazwie hosta (na przykład w
www.many...dots.com
):URI.parse
wydaje się narzucać prefiksowanie schematu, co w niektórych przypadkach nie jest tym, czego możesz chcieć (np. jeśli chcesz umożliwić użytkownikom szybkie pisanie adresów URL w formularzach takich jaktwitter.com/username
)źródło
I zostały z wykorzystaniem gem „activevalidators” i że to działa całkiem dobrze (nie tylko dla URL walidacji)
można go znaleźć tutaj
Wszystko jest udokumentowane, ale w zasadzie po dodaniu klejnotu będziesz chciał dodać następujące kilka wierszy w inicjatorze, powiedz: /config/environments/initializers/active_validators_activation.rb
(Uwaga: możesz zamienić: all na: url lub: cokolwiek, jeśli chcesz tylko zweryfikować określone typy wartości)
A potem w swoim modelu coś takiego
Teraz uruchom ponownie serwer i to powinno być to
źródło
Jeśli potrzebujesz prostej weryfikacji i niestandardowego komunikatu o błędzie:
źródło
Możesz zweryfikować wiele adresów URL za pomocą czegoś takiego:
źródło
https://github.com/perfectline/validates_url to ładny i prosty klejnot, który zrobi dla ciebie prawie wszystko
źródło
Ostatnio miałem ten sam problem i znalazłem obejście dla prawidłowych adresów URL.
Pierwsza część metody validate_url wystarczy do sprawdzenia poprawności formatu adresu URL. Druga część upewni się, że adres URL istnieje, wysyłając żądanie.
źródło
Podobało mi się monkeypatch moduł URI, aby dodać prawidłowe? metoda
wewnątrz
config/initializers/uri.rb
źródło
I jako moduł
A potem
include UrlValidator
w dowolnym modelu, dla którego chcesz sprawdzić poprawność adresu URL. Tylko w tym dla opcji.źródło
Walidacji adresu URL nie można przeprowadzić po prostu za pomocą wyrażenia regularnego, ponieważ liczba witryn internetowych stale rośnie i pojawiają się nowe schematy nazewnictwa domen.
W moim przypadku po prostu piszę niestandardowy walidator, który sprawdza pomyślną odpowiedź.
Sprawdzam
path
atrybut mojego modelu przy użyciurecord.path
. Przekazuję również błąd do odpowiedniej nazwy atrybutu przy użyciurecord.errors[:path]
.Możesz po prostu zastąpić to dowolną nazwą atrybutu.
Następnie po prostu dzwonię do niestandardowego walidatora w moim modelu.
źródło
Możesz do tego użyć wyrażenia regularnego, dla mnie działa dobrze ten:
źródło