Apakah ada cara dalam JavaScript untuk memeriksa apakah string adalah URL?
RegExes dikecualikan karena URL kemungkinan besar ditulis seperti stackoverflow
; artinya mengatakan bahwa ia mungkin tidak memiliki .com
, www
atau http
.
javascript
string
url
Bruno
sumber
sumber
http
, per default tidak ada url.<scheme>:<scheme-specific-part>
href
elemen jangkar, berfungsi saat memanggilwindow.open(url)
, menunjuk ke sesuatu yang benar-benar ada, berfungsi di lokasi browser bar, atau kombinasi di atas? Anda akan mendapatkan jawaban yang sangat berbeda tergantung dari mana yang Anda pedulikan.Jawaban:
Pertanyaan terkait dengan jawaban:
Pencocokan URL regex Javascript
Atau Regexp ini dari Devshed :
sumber
{ title: "Stackoverflow", uri: "http://stackoverflow.com" }
Pembaruan: memang, lihat code.google.com/chrome/extensions/bookmarks.htmlinvalid quantifier
. Ada ide?SyntaxError: Invalid regular expression: /^(https?://)?((([a-zd]([a-zd-]*[a-zd])*).)+[a-z]{2,}|((d{1,3}.){3}d{1,3}))(:d+)?(/[-a-zd%_.~+]*)*(?[;&a-zd%_.~+=-]*)?(#[-a-zd_]*)?$/: Invalid group
Pengembalian fungsi: Google Chrome (Versi 30.0.1599.101) (Mac OS X: 10.8.5)RegExp
Anda harus menggandakan lolos dari garis miring terbalik - jika tidak, Anda akan mendapatkan kesalahan seperti grup yang tidak valid .sumber
http://www.google.com/url?sa=i&rct=j&q=&esrc=s&source=images&cd=&docid=nIv5rk2GyP3hXM&tbnid=isiOkMe3nCtexM:&ved=0CAUQjRw&url=http%3A%2F%2Fanimalcrossing.wikia.com%2Fwiki%2FLion&ei=ygZXU_2fGKbMsQTf4YLgAQ&bvm=bv.65177938,d.aWc&psig=AFQjCNEpBfKnal9kU7Zu4n7RnEt2nerN4g&ust=1398298682009707
start = new Date(); isURL("http://michalstefanow.com"); end = new Date(); diff = end - start; console.log(diff)
Saya memakai teko, pergi ke toilet, memanggil ibu saya dan hal itu dilakukan dalam waktu singkat ...true
untukaaa
.isURL('12345678901234567890123')
tambahkan beberapa karakter dan bahkan lebih buruk.Anda dapat mencoba menggunakan
URL
konstruktor : jika tidak melempar, string adalah URL yang valid:Istilah 'URL' didefinisikan dalam RFC 3886 (sebagai URI); itu harus dimulai dengan nama skema, dan nama skema tidak terbatas pada http / https.
Contoh penting:
www.google.com
bukan URL yang valid (skema yang hilang)javascript:void(0)
adalah URL yang valid, meskipun bukan HTTPhttp://..
adalah URL yang valid, dengan host tersebut..
; apakah itu terselesaikan tergantung pada DNS Andahttps://google..com
URL yang valid, sama seperti di atasJika Anda ingin memeriksa apakah suatu string adalah URL HTTP yang valid:
sumber
href
atribut untuk<a>
. URL yang valid harus dimulai dengan nama skema , mishttps://
.isValidUrl("javascript:void(0)")
http://..
Atauhttp:///a
Daripada menggunakan ekspresi reguler, saya akan merekomendasikan menggunakan elemen anchor.
ketika Anda mengatur
href
properti suatuanchor
, berbagai properti lainnya diatur.sumber
Namun, jika nilainya
href
bukan url yang valid, maka nilai properti bantu tersebut akan menjadi string kosong.Edit: seperti yang ditunjukkan dalam komentar: jika url yang tidak valid digunakan, properti dari URL saat ini dapat diganti.
Jadi, selama Anda tidak memasukkan URL halaman saat ini, Anda dapat melakukan sesuatu seperti:
sumber
a.href
tidak valid,parser.host
kembalikan nama host halaman yang sedang Anda kunjungi, bukan yang diharapkanfalse
.<a href="invalidurl">
, itu tidak pergi ke domain Anda. Itu akan ditambahkan ke akhir url saat ini. Jadi Chrome melakukan hal yang benar dengan memberi Anda nama host saat ini dari elemen "parser".function isValidURL(str)
: jauh lebih baik daripada menggunakan regex! Terima kasih!Saya menggunakan fungsi di bawah ini untuk memvalidasi URL dengan atau tanpa
http/https
:sumber
https://sdfasdp.ppppppppppp
yaitu kembalitrue
tetapi pengembalian sayafalse
yang diharapkan saya pikir.[email protected]
... bukan? Saya kira tidak seharusnyaUntuk Memvalidasi Url menggunakan javascript ditampilkan di bawah ini
sumber
(http|https)
menjadi(?:https?)
; b):{0,1}
untuk:?
; c)[0-9]
ke\d
Andalkan perpustakaan: https://www.npmjs.com/package/valid-url
sumber
{
di urlPeningkatan pada jawaban yang diterima ...
Mengizinkan @ simbol di jalur, mis. Https://medium.com/@techytimo
sumber
Inilah metode lain.
sumber
new URL(string)
kerja kode Pavlo. Kedua tes memiliki hasil yang identik dengan semua kasus tepi yang saya uji. Saya suka kodenya karena lebih sederhana dan tidak melibatkan pembuatan elemen, tetapi kode Anda beberapa kali lebih cepat (mungkin karena tidak membuat el setelah penggunaan pertama).(Saya tidak punya perwakilan untuk mengomentari ValidURL contoh ; oleh karena itu posting ini sebagai jawaban.)
Sementara penggunaan URL relatif protokol tidak dianjurkan ( URL Protocol-relatif ), mereka mendapatkan pekerjaan kadang-kadang. Untuk memvalidasi URL seperti itu dengan ekspresi reguler, bagian protokol bisa jadi opsional, misalnya:
Seperti yang dicatat orang lain, ekspresi reguler tampaknya bukan pendekatan yang paling cocok untuk memvalidasi URL.
sumber
isValidURL("https://[email protected]/13176")
@
. Itu tidak menggantung di browser saya .Anda dapat menggunakan API asli URL :
sumber
Seperti yang telah dicatat, regex sempurna sulit dipahami tetapi tampaknya masih merupakan pendekatan yang masuk akal (alternatifnya adalah tes sisi server atau API URL eksperimental baru ). Namun, jawaban dengan peringkat tinggi sering kali kembali palsu untuk URL umum, tetapi lebih buruk lagi akan membekukan aplikasi / halaman Anda selama beberapa menit bahkan dengan string sederhana
isURL('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
. Sudah ditunjukkan di beberapa komentar, tetapi kemungkinan besar belum memasukkan nilai buruk untuk melihatnya. Tergantung seperti itu membuat kode itu tidak dapat digunakan dalam aplikasi serius apa pun. Saya pikir itu karena set kasus sensitif ulang kode seperti((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.?)+[a-z]{2,}|' ...
. Keluarkan 'i' dan itu tidak menggantung tetapi tentu saja tidak akan berfungsi seperti yang diinginkan. Tetapi bahkan dengan flag abaikan pengujian tersebut menolak nilai unicode tinggi yang diizinkan.Yang terbaik yang telah disebutkan adalah:
Itu berasal dari Github segmentio / is-url . Hal yang baik tentang repositori kode adalah Anda dapat melihat pengujian dan masalah apa pun dan juga string pengujian yang menjalankannya. Ada cabang yang akan memungkinkan string protokol yang hilang seperti
google.com
, meskipun Anda mungkin membuat terlalu banyak asumsi saat itu. Repositori telah diperbarui dan saya tidak berencana mencoba menjaga mirror di sini. Ini telah dipecah menjadi beberapa tes terpisah untuk menghindari reduksi RegEx yang dapat dieksploitasi untuk serangan DOS (saya tidak berpikir Anda harus khawatir tentang itu dengan sisi klien, tetapi Anda harus khawatir tentang halaman Anda menggantung begitu lama sehingga Anda pengunjung meninggalkan situs Anda).Ada satu repositori lain yang pernah saya lihat yang bahkan mungkin lebih baik untuk isURL di dperini / regex-weburl.js , tetapi ini sangat kompleks. Ini memiliki daftar tes yang lebih besar dari URL yang valid dan tidak valid. Yang sederhana di atas masih melewati semua positif dan hanya gagal untuk memblokir beberapa negatif aneh seperti
http://a.b--c.de/
ips khusus.Apa pun yang Anda pilih, jalankan melalui fungsi ini yang telah saya adaptasi dari tes di dperini / regex-weburl.js, saat menggunakan inpector Alat Pengembang browser Anda.
Dan kemudian uji string 'a's.
Lihat perbandingan regex isURL ini oleh Mathias Bynens untuk info lebih lanjut sebelum Anda memposting regex yang tampaknya hebat.
sumber
isURL('a'.repeat(100))
jutaan kali / detik (yang lebih kompleks dari dperini sebenarnya lebih cepat). Beberapa jawaban peringkat tinggi dari formulir ([a-zA-Z] +) * akan membutuhkan waktu berjam-jam untuk menyelesaikannya sekali. Cari ulang RegEx untuk informasi lebih lanjut.Saya tidak dapat mengomentari pos yang paling dekat # 5717133 , tetapi di bawah ini adalah cara saya menemukan cara agar @ tom-gullen regex berfungsi.
sumber
var pattern = new RegExp('(https?:\\/\\/)?((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$', 'i');
Gunakan validator.js
ES6
Tidak ada ES6
Anda juga dapat memperbaiki perilaku fungsi ini dengan meneruskan
options
objek opsional sebagai argumen keduaisURL
Ini adalah
options
objek default :host_whitelist
danhost_blacklist
bisa berupa array host. Mereka juga mendukung ekspresi reguler.sumber
Salah satu fungsi yang telah saya gunakan untuk memvalidasi URL "string" adalah:
Fungsi ini akan mengembalikan boolean apakah string adalah URL.
Contoh:
sumber
Ini cukup sulit dilakukan dengan regex murni karena URL memiliki banyak 'ketidaknyamanan'.
Misalnya nama domain memiliki batasan rumit pada tanda hubung:
Sebuah. Diijinkan memiliki banyak tanda hubung berturut-turut di tengah.
b. tetapi karakter pertama dan karakter terakhir dari nama domain tidak boleh berupa tanda hubung
c. Karakter ke-3 dan ke-4 tidak boleh berupa tanda hubung
Demikian pula nomor port hanya bisa di kisaran 1-65535. Ini mudah untuk memeriksa apakah Anda mengekstrak bagian port dan mengubahnya,
int
tetapi cukup sulit untuk memeriksa dengan ekspresi reguler.Juga tidak ada cara mudah untuk memeriksa ekstensi domain yang valid. Beberapa negara memiliki domain tingkat kedua (seperti 'co.uk'), atau ekstensi dapat berupa kata yang panjang seperti '.international'. Dan TLD baru ditambahkan secara teratur. Jenis-jenis hal ini hanya dapat diperiksa terhadap daftar kode-keras. (lihat https://en.wikipedia.org/wiki/Top-level_domain )
Lalu ada url magnet, alamat ftp dll. Semua ini memiliki persyaratan yang berbeda.
Namun demikian, berikut adalah fungsi yang menangani hampir semua hal kecuali:
sumber
Saya pikir menggunakan API URL asli lebih baik daripada pola regex kompleks seperti yang disarankan @pavlo. Ini memiliki beberapa kelemahan yang dapat kita perbaiki dengan beberapa kode tambahan. Pendekatan ini gagal untuk url yang valid berikut.
Kita dapat menambahkan protokol yang hilang sebelumnya untuk menghindari itu. Juga gagal mendeteksi url berikut yang tidak valid.
Jadi mengapa memeriksa seluruh url? kita cukup memeriksa domainnya. Saya meminjam regex untuk memverifikasi domain dari sini .
The
hostname
atribut string kosong untukjavascript:void(0)
, sehingga bekerja untuk itu juga, dan Anda juga dapat menambahkan alamat IP verifier juga. Saya ingin tetap menggunakan API asli, dan berharap itu mulai mendukung semuanya dalam waktu dekat.sumber
new URL
tidak ada dalam tes yang saya lakukan. Ini memanggil:http://142.42.1.1 //false
dan memblokir string unicode tinggi.Pertanyaannya menanyakan metode validasi untuk url seperti
stackoverflow
, tanpa protokol atau titik apa pun di nama host. Jadi, ini bukan masalah memvalidasi sintaks url, tetapi memeriksa apakah itu url yang valid, dengan benar-benar memanggilnya.Saya mencoba beberapa metode untuk mengetahui apakah url benar ada dan dapat dipanggil dari dalam browser, tetapi tidak menemukan cara untuk menguji dengan javascript header respons panggilan:
click()
metode.'GET'
baik-baik saja, tetapi memiliki berbagai keterbatasan karenaCORS
kebijakan dan itu bukan kasus menggunakanajax
, karena sebagai url mungkin ada di luar domain server saya.https
protokol dan melempar pengecualian saat memanggil url tidak aman.Jadi, solusi terbaik yang dapat saya pikirkan adalah mendapatkan beberapa alat untuk melakukan
CURL
menggunakan javascript mencoba sesuatu seperticurl -I <url>
. Sayangnya saya tidak menemukan apa pun dan sepertinya itu tidak mungkin. Saya akan menghargai komentar Anda tentang ini.Tetapi, pada akhirnya, saya memiliki server yang berjalan
PHP
dan karena saya menggunakan Ajax untuk hampir semua permintaan saya, saya menulis sebuah fungsi di sisi server untuk melakukan permintaan ikal di sana dan kembali ke browser.Mengenai url kata tunggal pada pertanyaan 'stackoverflow' itu akan membawa saya ke
https://daniserver.com.ar/stackoverflow
, di mana daniserver.com.ar adalah domain saya sendiri.sumber
foo
dan menganggap itu http atau https atau .com atau .es atau salah satu sufiks yang tak terhitung jumlahnya? Apakah Anda terus melemparkan wastafel dapur sampai Anda mendapatkan yang benar?Ini tampaknya menjadi salah satu masalah tersulit dalam CS;)
Berikut ini adalah solusi tidak lengkap lainnya yang berfungsi cukup baik untuk saya dan lebih baik daripada yang lain yang saya lihat di sini. Saya menggunakan input [type = url] untuk ini untuk mendukung IE11, jika tidak akan jauh lebih mudah menggunakan window.URL untuk melakukan validasi sebagai gantinya:
Untuk menerima input yang tidak lengkap seperti "www.mydomain.com" itu juga akan membuatnya valid dengan asumsi protokol adalah "http" dalam kasus-kasus tersebut dan mengembalikan URL yang valid jika alamat itu valid. Ini mengembalikan false ketika tidak valid.
Ini juga mendukung domain IPv4, tetapi tidak IPv6.
sumber
Dalam kasus saya, satu-satunya persyaratan saya adalah bahwa input pengguna tidak akan diartikan sebagai tautan relatif ketika ditempatkan di href dari sebuah tag dan jawaban di sini adalah sedikit OTT untuk itu atau URL yang diizinkan tidak memenuhi persyaratan saya, jadi ini adalah apa yang akan saya ikuti:
Hal yang sama dapat dicapai dengan mudah tanpa regex.
sumber
ini bekerja dengan saya
sumber
Jika Anda dapat mengubah jenis input, saya pikir solusi ini akan jauh lebih mudah:
Anda dapat menggunakan sederhana
type="url"
dalam input Anda dan periksa dengancheckValidity()
di jsMisalnya:
your.html
milikmu
sumber
Ini jelas bukan pendekatan yang paling efektif, tetapi mudah dibaca dan mudah dibentuk untuk apa pun yang Anda butuhkan. Dan lebih mudah untuk menambahkan regex / kompleksitas dari sini. Jadi, inilah pendekatan yang sangat pragmatis
UJI:
sumber
Mathias Bynens telah menyusun daftar regex URL yang terkenal dengan URL uji. Ada sedikit alasan untuk menulis ungkapan reguler baru; pilih saja yang sudah ada yang paling cocok untuk Anda.
Tetapi tabel perbandingan untuk regex tersebut juga menunjukkan bahwa hampir tidak mungkin untuk melakukan validasi URL dengan satu ekspresi reguler. Semua regex dalam daftar Bynens menghasilkan false positive dan false negative.
Saya sarankan Anda menggunakan parser URL yang ada (misalnya
new URL('http://www.example.com/')
dalam JavaScript) dan kemudian menerapkan pemeriksaan yang ingin Anda lakukan terhadap bentuk URL resp yang diuraikan dan dinormalisasi. komponennya. MenggunakanURL
antarmuka JavaScript memiliki manfaat tambahan karena hanya akan menerima URL yang benar-benar diterima oleh browser.Anda juga harus ingat bahwa URL yang secara teknis salah mungkin masih berfungsi. Sebagai contoh
http://w_w_w.example.com/
,http://www..example.com/
,http://123.example.com/
semua memiliki bagian hostname tidak valid tapi setiap browser saya tahu akan mencoba untuk membuka mereka tanpa keluhan, dan ketika Anda menentukan alamat IP untuk nama-nama tidak valid dalam/etc/hosts/
URL tersebut bahkan akan bekerja tetapi hanya pada komputer Anda.Karena itu, pertanyaannya adalah bukan apakah URL itu valid, melainkan URL mana yang berfungsi dan harus diizinkan dalam konteks tertentu.
Jika Anda ingin melakukan validasi URL, ada banyak detail dan kasus tepi yang mudah diabaikan:
http://user:[email protected]/
.http://www.stackoverflow.com.
).[-0-9a-zA-z]
sudah pasti tidak lagi memadai.co.uk
dan banyak lainnya).Yang mana dari batasan dan aturan ini yang berlaku adalah pertanyaan tentang persyaratan dan selera proyek.
Baru-baru ini saya menulis validator URL untuk aplikasi web yang cocok untuk URL yang disediakan pengguna di forum, jejaring sosial, atau sejenisnya. Jangan ragu untuk menggunakannya sebagai basis untuk basis Anda sendiri:
Saya juga telah menulis posting blog The Gory Details of Validasi URL dengan informasi lebih mendalam.
sumber
Saya mengubah fungsi untuk mencocokkan + membuat perubahan di sini dengan garis miring dan kerjanya: (http: // dan https) keduanya
sumber
Berikut ini hanya pemeriksaan yang sangat sederhana untuk memastikan ada protokol yang valid, dan ekstensi domain harus dua atau lebih karakter.
sumber
Jika Anda juga perlu mendukung
https://localhost:3000
maka gunakan versi modifikasi dari [Devshed] ini.sumber
Ada beberapa tes menggunakan konstruktor URL yang tidak menggambarkan apakah inputnya berupa string atau objek URL.
sumber
Pembaruan 2020. Untuk memperluas jawaban answerd baik dari @iamnewton dan @Fernando Chavez Herrera, saya mulai melihat
@
sedang digunakan di jalur URL.Jadi regex yang diperbarui adalah:
Jika Anda ingin mengizinkannya dalam string kueri dan hash, gunakan:
Yang sedang berkata, saya tidak yakin apakah ada aturan whitepaper melarang
@
dalam string kueri atau hash.sumber
Sudah ada banyak jawaban, tetapi inilah kontribusi lain: Diambil langsung dari
URL
pemeriksaan validitas polyfill, gunakaninput
elemen dengantype="url"
untuk mengambil keuntungan dari pemeriksaan validitas bawaan browser:Sumber
sumber