Saya bertanya-tanya bagaimana cara terbaik memvalidasi URL di Rails. Saya berpikir untuk menggunakan ekspresi reguler, tetapi tidak yakin apakah ini adalah praktik terbaik.
Dan, jika saya menggunakan regex, dapatkah seseorang menyarankannya kepada saya? Saya masih baru di Regex.
Jawaban:
Memvalidasi URL adalah pekerjaan yang rumit. Ini juga permintaan yang sangat luas.
Sebenarnya apa yang ingin kamu lakukan? Apakah Anda ingin memvalidasi format URL, keberadaannya, atau apa? Ada beberapa kemungkinan, tergantung pada apa yang ingin Anda lakukan.
Ekspresi reguler dapat memvalidasi format URL. Tetapi bahkan ekspresi reguler yang kompleks tidak dapat memastikan Anda berurusan dengan URL yang valid.
Misalnya, jika Anda menggunakan ekspresi reguler sederhana, host berikut mungkin akan ditolak
tapi itu akan memungkinkan
itu adalah host yang valid, tetapi bukan domain yang valid jika Anda mempertimbangkan TLD yang ada. Memang, solusi akan berhasil jika Anda ingin memvalidasi nama host, bukan domainnya karena yang berikut ini adalah nama host yang valid
serta yang berikut ini
Sekarang, izinkan saya memberi Anda beberapa solusi.
Jika Anda ingin memvalidasi domain, Anda harus melupakan ekspresi reguler. Solusi terbaik yang tersedia saat ini adalah Daftar Sufiks Publik, daftar yang dikelola oleh Mozilla. Saya membuat perpustakaan Ruby untuk mengurai dan memvalidasi domain terhadap Daftar Sufiks Publik, dan itu disebut PublicSuffix .
Jika Anda ingin memvalidasi format URI / URL, Anda mungkin ingin menggunakan ekspresi reguler. Alih-alih mencarinya, gunakan
URI.parse
metode Ruby bawaan.Anda bahkan dapat memutuskan untuk membuatnya lebih ketat. Misalnya, jika Anda ingin URL menjadi HTTP / HTTPS URL, Anda dapat membuat validasi lebih akurat.
Tentu saja, ada banyak perbaikan yang bisa Anda terapkan pada metode ini, termasuk memeriksa jalur atau skema.
Terakhir, Anda juga dapat mengemas kode ini menjadi validator:
sumber
URI::HTTPS
untuk https uris (mis:URI.parse("https://yo.com").class => URI::HTTPS
URI::HTTPS
mewarisi dariURI:HTTP
, itulah alasan mengapa saya menggunakankind_of?
.URI.parse('http://invalid-host.foo')
mengembalikan nilai true karena URI tersebut adalah URL yang valid. Perhatikan juga bahwa.foo
sekarang menjadi TLD yang valid. iana.org/domains/root/db/foo.htmlSaya menggunakan satu liner di dalam model saya:
validates :url, format: URI::regexp(%w[http https])
Menurut saya cukup bagus dan mudah digunakan. Selain itu secara teoritis harus setara dengan metode Simone, karena menggunakan regexp yang sama secara internal.
sumber
'http://'
cocok dengan pola di atas. Lihat:URI::regexp(%w(http https)) =~ 'http://'
http:fake
akan valid.Mengikuti ide Simone, Anda dapat dengan mudah membuat validator sendiri.
dan kemudian gunakan
dalam model Anda.
sumber
URI("http:").kind_of?(URI::HTTP) #=> true
Ada juga permata validate_url (yang merupakan pembungkus yang bagus untuk
Addressable::URI.parse
solusi).Tambahkan saja
ke Anda
Gemfile
, dan kemudian dalam model yang Anda bisasumber
Pertanyaan ini sudah terjawab, tapi apa sih, saya mengusulkan solusi yang saya gunakan.
Regexp berfungsi dengan baik dengan semua url yang saya temui. Metode penyetel adalah berhati-hati jika tidak ada protokol yang disebutkan (anggap saja http: //).
Dan akhirnya, kami mencoba mengambil halaman tersebut. Mungkin saya harus menerima pengalihan dan tidak hanya HTTP 200 OK.
dan...
sumber
Anda juga dapat mencoba valid_url gem yang memungkinkan URL tanpa skema, memeriksa zona domain dan nama host ip.
Tambahkan ke Gemfile Anda:
gem 'valid_url'
Dan kemudian di model:
sumber
Hanya 2 sen saya:
EDIT: mengubah ekspresi reguler untuk mencocokkan url parameter.
sumber
http://test.com/fdsfsdf?a=b
Solusi yang berhasil untuk saya adalah:
Saya memang mencoba menggunakan beberapa contoh yang Anda lampirkan tetapi saya mendukung url seperti:
Perhatikan penggunaan A dan Z karena jika Anda menggunakan ^ dan $ Anda akan melihat peringatan keamanan ini dari validator Rails.
sumber
"https://portal.example.com/portal/#"
. Di Ruby 2.1.6 evaluasi macet.Saya mengalami masalah yang sama belakangan ini (saya perlu memvalidasi url di aplikasi Rails) tetapi saya harus mengatasi persyaratan tambahan url unicode (mis.
http://кц.рф
) ...Saya meneliti beberapa solusi dan menemukan yang berikut:
URI.parse
. Cek jawaban Simone Carletti untuk detailnya. Ini berfungsi dengan baik, tetapi tidak untuk url unicode.URI.parse
tetapi menggunakanaddressable
permata daripadaURI
stdlib. Pendekatan ini dirinci di sini: http://rawsyntax.com/blog/url-validation-in-rails-3-and-ruby-in-general/sumber
Addressable::URI.parse('http:///').scheme # => "http"
atauAddressable::URI.parse('Съешь [же] ещё этих мягких французских булок да выпей чаю')
sangat oke dari sudut pandang Addressable :(Berikut adalah versi terbaru dari validator yang diposting oleh David James . Ini telah diterbitkan oleh Benjamin Fleischer . Sementara itu, saya mendorong garpu yang diperbarui yang dapat ditemukan di sini .
...
Harap perhatikan bahwa masih ada URI HTTP aneh yang diuraikan sebagai alamat yang valid.
Ini adalah masalah
addressable
permata yang mencakup contoh.sumber
Saya menggunakan sedikit variasi pada solusi lafeber di atas . Ini melarang titik berurutan di nama host (seperti misalnya di
www.many...dots.com
):URI.parse
tampaknya mengamanatkan skema awalan, yang dalam beberapa kasus bukan yang Anda inginkan (misalnya jika Anda ingin mengizinkan pengguna Anda untuk mengeja URL dengan cepat dalam bentuk sepertitwitter.com/username
)sumber
Saya telah menggunakan permata 'activevalidators' dan berfungsi dengan cukup baik (tidak hanya untuk validasi url)
Anda dapat menemukannya di sini
Semuanya didokumentasikan tetapi pada dasarnya setelah permata ditambahkan, Anda akan ingin menambahkan beberapa baris berikut di penginisialisasi, katakan: /config/environments/initializers/active_validators_activation.rb
(Catatan: Anda dapat mengganti: semua dengan: url atau: apa pun jika Anda hanya ingin memvalidasi jenis nilai tertentu)
Dan kemudian kembali ke model Anda sesuatu seperti ini
Sekarang Restart server dan seharusnya itu saja
sumber
Jika Anda menginginkan validasi sederhana dan pesan kesalahan khusus:
sumber
Anda dapat memvalidasi banyak url menggunakan sesuatu seperti:
sumber
https://github.com/perfectline/validates_url adalah permata yang bagus dan sederhana yang akan melakukan hampir semua hal untuk Anda
sumber
Baru-baru ini saya mengalami masalah yang sama dan saya menemukan solusi untuk url yang valid.
Bagian pertama dari metode validate_url sudah cukup untuk memvalidasi format url. Bagian kedua akan memastikan url ada dengan mengirimkan permintaan.
sumber
Saya suka mencocokkan modul URI untuk menambahkan valid? metode
dalam
config/initializers/uri.rb
sumber
Dan sebagai modul
Dan kemudian hanya
include UrlValidator
di model apa pun yang ingin Anda validasi url-nya. Hanya termasuk untuk opsi.sumber
Validasi URL tidak dapat ditangani hanya dengan menggunakan Ekspresi Reguler karena jumlah situs web terus bertambah dan skema penamaan domain baru terus bermunculan.
Dalam kasus saya, saya hanya menulis validator khusus yang memeriksa respons yang berhasil.
Saya memvalidasi
path
atribut model saya dengan menggunakanrecord.path
. Saya juga mendorong kesalahan ke nama atribut masing-masing dengan menggunakanrecord.errors[:path]
.Anda cukup mengganti ini dengan nama atribut apa saja.
Kemudian, saya cukup memanggil validator khusus dalam model saya.
sumber
Anda bisa menggunakan regex untuk ini, bagi saya berfungsi dengan baik yang ini:
sumber