Bagaimana saya bisa memeriksa apakah string yang diberikan adalah alamat URL yang valid?
Pengetahuan saya tentang ekspresi reguler adalah dasar dan tidak memungkinkan saya untuk memilih dari ratusan ekspresi reguler yang telah saya lihat di web.
regex
url
language-agnostic
Vitor Silva
sumber
sumber
Jawaban:
Saya menulis pola URL saya (sebenarnya IRI, internasional) untuk mematuhi RFC 3987 ( http://www.faqs.org/rfcs/rfc3987.html ). Ini ada dalam sintaks PCRE.
Untuk IRI absolut (internasionalisasi):
Untuk juga mengizinkan IRI relatif:
Bagaimana mereka dikompilasi (dalam PHP):
Sunting 7 Maret 2011: Karena cara PHP menangani garis miring terbalik dalam string yang dikutip, ini tidak dapat digunakan secara default. Anda harus meloloskan diri dari backslash kecuali jika backslash memiliki arti khusus dalam regex. Anda dapat melakukannya dengan cara ini:
sumber
http://com
adalah URL yang valid.http://localhost
adalah, mengapa tidak ada kata lain? Anda benar bahwau
pengubah diperlukan dalam PHP. Saya ingin menjadi jelas bahwa sementara saya membuat ini dengan PHP, mereka tidak dimaksudkan untuk menjadi PHP-spesifik.Saya baru saja menulis posting blog untuk solusi hebat mengenali URL dalam format yang paling sering digunakan seperti:
www.google.com
http://www.google.com
mailto:[email protected]
[email protected]
www.url-with-querystring.com/?url=has-querystring
Ekspresi reguler yang digunakan adalah:
sumber
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(:[0-9]+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)/
width:210px;
danmargin:3px
Platform apa? Jika menggunakan .NET, gunakan
System.Uri.TryCreate
, bukan regex.Sebagai contoh:
(Terima kasih kepada @Yoshi untuk tipnya
javascript:
)sumber
javascript: alert('blah')
. Anda perlu melakukan validasi lebih lanjut pada Uri. Skema untuk mengonfirmasi protokol http / https / ftp sedang digunakan, jika tidak, jika URL seperti itu dimasukkan ke dalam HTML laman ASP.NET sebagai tautan, pengguna Anda rentan terhadap serangan XSS .Uri.IsWellFormedUriString()
Inilah yang digunakan RegexBuddy .
Cocok dengan yang di bawah ini (di dalam
** **
tanda):Anda dapat mengunduh RegexBuddy di http://www.regexbuddy.com/download.html .
sumber
/\b(https?|ftp|file):\/\/[\-A-Za-z0-9+&@#\/%?=~_|!:,.;]*[\-A-Za-z0-9+&@#\/%=~_|]/
Berkenaan dengan posting jawaban kelopak mata yang bertuliskan "Ini didasarkan pada pembacaan spesifikasi URI saya.": Terima kasih Eyelidness, milik Anda adalah solusi sempurna yang saya cari, karena didasarkan pada spesifikasi URI! Kerja luar biasa. :)
Saya harus membuat dua amandemen. Yang pertama mendapatkan regexp agar sesuai dengan URL alamat IP dengan benar di PHP (v5.2.10) dengan fungsi preg_match ().
Saya harus menambahkan satu set kurung lagi ke baris di atas "Alamat IP" di sekitar pipa:
Tidak yakin kenapa.
Saya juga mengurangi panjang minimum domain tingkat atas dari 3 menjadi 2 huruf untuk mendukung .co.uk dan yang serupa.
Kode terakhir:
Versi modifikasi ini tidak dicentang dengan spesifikasi URI jadi saya tidak dapat menjamin kepatuhannya, itu diubah untuk menangani URL pada lingkungan jaringan lokal dan dua digit TLD serta jenis URL Web lainnya, dan untuk bekerja lebih baik dalam PHP pengaturan yang saya gunakan.
Sebagai kode PHP :
Berikut adalah program pengujian dalam PHP yang memvalidasi berbagai URL menggunakan regex:
Terima kasih sekali lagi untuk kelopak mata untuk regex!
sumber
')((([a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
dengan')((([a-z0-9]\.|[a-z0-9][a-z0-9-]*[a-z0-9]\.)*'.
." Saya telah membuat edit yang relevan berdasarkan komentar ini./^(https?|ftp):
(protokol) Mengapa Anda melarang protokol seperti data, file, svn, dc ++, magnet, skype atau lainnya yang didukung oleh browser yang memiliki plugin atau server yang sesuai?Mathias Bynens memiliki artikel yang bagus tentang perbandingan terbaik dari banyak ekspresi reguler: Dalam mencari regex validasi URL yang sempurna
Yang terbaik diposting agak lama, tetapi cocok dengan apa pun yang Anda bisa melemparnya.
Versi JavaScript
Versi PHP
sumber
%^(?:(?:https?|ftp)://)(?:\S+(?::\S*)?@|\d{1,3}(?:\.\d{1,3}){3}|(?:(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)(?:\.(?:[a-z\d\x{00a1}-\x{ffff}]+-?)*[a-z\d\x{00a1}-\x{ffff}]+)*(?:\.[a-z\x{00a1}-\x{ffff}]{2,6}))(?::\d+)?(?:[^\s]*)?$%iu
Posting Mendapatkan bagian dari URL (Regex) membahas penguraian URL untuk mengidentifikasi berbagai komponennya. Jika Anda ingin memeriksa apakah URL terbentuk dengan baik, itu harus cukup untuk kebutuhan Anda.
Jika Anda perlu memeriksa apakah itu benar-benar valid, Anda akhirnya harus mencoba mengakses apa pun yang ada di ujung sana.
Namun, secara umum, Anda mungkin akan lebih baik menggunakan fungsi yang disediakan oleh kerangka kerja Anda atau pustaka lain. Banyak platform menyertakan fungsi yang mem-parsing URL. Misalnya, ada modul urlparse Python , dan dalam. NET Anda bisa menggunakan konstruktor kelas System.Uri sebagai sarana untuk memvalidasi URL.
sumber
Ini mungkin bukan pekerjaan untuk regex, tetapi untuk alat yang ada dalam bahasa pilihan Anda. Anda mungkin ingin menggunakan kode yang sudah ada yang telah ditulis, diuji, dan di-debug.
Di PHP, gunakan
parse_url
fungsinya.Perl:
URI
modul .Ruby:
URI
modul ..NET: kelas 'Uri'
Regex bukan tongkat ajaib yang Anda lambaikan di setiap masalah yang melibatkan string.
sumber
java.net.URL
.Parser referensi-URI yang tidak valid
Untuk tujuan referensi, inilah Spesifikasi IETF: ( TXT | HTML ). Secara khusus, Lampiran B. Mengurai Referensi URI dengan Ekspresi Reguler menunjukkan cara mem-parsing regex yang valid . Ini digambarkan sebagai,
Inilah regex yang mereka sediakan:
Seperti yang dikatakan orang lain, mungkin lebih baik membiarkan ini pada lib / framework yang sudah Anda gunakan.
sumber
Ini akan cocok dengan semua URL
... termasuk sub-domain dan ekstensi nama domain tingkat atas baru seperti. museum ,. akademi ,. foundation dll. yang dapat memiliki hingga 63 karakter (bukan hanya. com , .net ,. info, dll.)
Karena hari ini panjang maksimum ekstensi nama domain tingkat atas yang tersedia adalah 13 karakter seperti. internasional , Anda dapat mengubah angka 63 dalam ekspresi menjadi 13 untuk mencegah seseorang menyalahgunakannya.
sebagai javascript
Artikel Wikipedia: Daftar semua domain tingkat atas internet
sumber
t.co
. Bagaimana Anda menyesuaikannya untuk menangani kasus ini?Ekspresi reguler terbaik untuk URL bagi saya adalah:
sumber
(([\\w]+:)?//)?(([\\d\\w]|%[a-fA-f\\d]{2,2})+(:([\\d\\w]|%[a-fA-f\\d]{2,2})+)?@)?([\\d\\w][-\\d\\w]{0,253}[\\d\\w]\\.)+[\\w]{2,4}(:[\\d]+)?(/([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)*(\\?(&?([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})=?)*)?(#([-+_~.\\d\\w]|%[a-fA-f\\d]{2,2})*)?
\w
dengan\p{L}
minimum.([\d\w][-\d\w]{0,253}[\d\w]\.)+
menjadi([\d\w][-\d\w]{0,253}[\d\w]?\.)+
(tambahkan tanda tanya di dekat akhir)Cocok dengan http://site.com/dir/file.php?var=moo | ftp: // user: [email protected]: 21 / file / dir
Ketidakcocokan site.com | http://site.com/dir//
sumber
http://www.goo gle.com
akan cocok.Cocok dengan http://www.asdah.com/~joe | ftp://ftp.asdah.co.uk:2828/asdah%20asdah.gif | https://asdah.gov/asdh-ah.as
sumber
Saya tidak dapat menemukan regex yang saya cari, jadi saya memodifikasi regex untuk memenuhi persyaratan saya, dan tampaknya itu berfungsi dengan baik sekarang. Persyaratan saya adalah:
Inilah yang saya kemukakan, setiap saran sangat dihargai:
sumber
Jika Anda benar-benar mencari yang paling cocok, Anda mungkin menemukannya di " Ekspresi Reguler Baik Url? ".
Tetapi sebuah regex yang benar-benar cocok dengan semua domain yang mungkin dan memungkinkan apa pun yang diizinkan menurut RFC sangat panjang dan tidak dapat dibaca, percayalah ;-)
sumber
Saya telah mengerjakan artikel mendalam yang membahas validasi URI menggunakan ekspresi reguler. Ini didasarkan pada RFC3986.
Validasi URI Ekspresi Reguler
Meskipun artikelnya belum lengkap, saya telah menghasilkan fungsi PHP yang cukup baik dalam memvalidasi URL HTTP dan FTP. Ini adalah versi saat ini:
Fungsi ini menggunakan dua regex; satu untuk mencocokkan subset dari URI generik yang valid (yang absolut memiliki host yang tidak kosong), dan yang kedua untuk memvalidasi nama host DNS "dot-separated-parts". Meskipun fungsi ini saat ini hanya memvalidasi skema HTTP dan FTP, ia disusun sedemikian rupa sehingga dapat dengan mudah diperluas untuk menangani skema lain.
sumber
saya menulis versi asyik kecil yang dapat Anda jalankan
cocok dengan url berikut (yang cukup baik untuk saya)
http://google.com
http://google.com/help.php
http://google.com/help.php?a=5
http://www.google.com
http://www.google.com/help.php
http://www.google.com?a=5
google.com?a=5
google.com/help.php
google.com/help.php?a=5
http://www.m.google.com/help.php?a=5 (dan semua permutasi)
www.m.google.com/help.php?a=5 (dan semua permutasi)
m.google.com/help.php?a=5 (dan semua permutasi)
Yang penting untuk setiap url yang tidak dimulai dengan http atau www adalah mereka harus menyertakan a / atau?
Saya yakin ini bisa di-tweak sedikit lagi, tetapi ini berhasil dengan sangat pendek dan ringkas ... karena Anda dapat membaginya menjadi 3:
temukan sesuatu yang dimulai dengan http: https?: // w {0,3} \ w *?. \ w {2,3} \ S *
temukan apa pun yang dimulai dengan www: www. \ w *?. \ w {2,3} \ S *
atau menemukan sesuatu yang harus memiliki teks kemudian titik kemudian paling tidak 2 huruf dan kemudian? atau /: \ w *?. \ w {2,3} [/ \?] \ S *
sumber
-
di URL.Saya menggunakan regex ini:
Untuk mendukung keduanya:
Dan:
sumber
((https?:)?(\/?\/))(([\d\w]|%[a-fA-f\d]{2,2})+(:([\d\w]|%[a-fA-f\d]{2,2})+)?@)?([\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63}(:[\d]+)?(/([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(&?([-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#([-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
((?:https?:)?(?:\/?\/))((?:[\d\w]|%[a-fA-f\d]{2,2})+(?::(?:[\d\w]|%[a-fA-f\d]{2,2})+)?@)?((?:[\d\w][-\d\w]{0,253}[\d\w]\.)+[\w]{2,63})(:[\d]+)?(\/(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)*(\?(?:&?(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})=?)*)?(#(?:[-+_~.\d\w]|%[a-fA-f\d]{2,2})*)?
Berikut ini adalah aturan yang baik yang mencakup semua kasus yang mungkin: port, params, dll
sumber
Yang ini bekerja dengan baik untuk saya.
(https?|ftp)://(www\d?|[a-zA-Z0-9]+)?\.[a-zA-Z0-9-]+(\:|\.)([a-zA-Z0-9.]+|(\d+)?)([/?:].*)?
sumber
Berikut ini adalah versi Java siap pakai dari kode sumber Android. Ini yang terbaik yang saya temukan.
sumber
Berikut adalah regex yang saya buat yang mengekstrak bagian-bagian berbeda dari sebuah URL:
^((?:https?|ftp):\/\/?)?([^:/\s.]+\.[^:/\s]|localhost)(:\d+)?((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?([^#]+)?(#[\w-]+)?$
((?:https?|ftp):\/\/?)?
(grup 1) : mengekstrak protokol([^:/\s.]+\.[^:/\s]|localhost)
(grup 2) : mengekstrak nama host(:\d+)?
(grup 3) : mengekstrak nomor port((?:\/\w+)*\/)?([\w\-.]+[^#?\s]+)?
(grup 4 & 5) : mengekstrak bagian jalur([^#]+)?
(grup 6) : mengekstrak bagian permintaan(#[\w-]+)?
(grup 7) : ekstrak bagian hashUntuk setiap bagian dari regex yang tercantum di atas, Anda dapat menghapus akhir
?
untuk memaksanya (atau menambahkannya untuk membuatnya fakultatif). Anda juga dapat menghapus^
di awal dan$
di akhir regex sehingga tidak perlu cocok dengan seluruh string.Lihat di regex101 .
Catatan: regex ini tidak 100% aman dan dapat menerima beberapa string yang tidak harus URL yang valid tetapi memang memvalidasi beberapa kriteria. Tujuan utamanya adalah mengekstraksi bagian-bagian berbeda dari URL untuk tidak memvalidasinya.
sumber
Untuk Python, ini adalah URL aktual yang memvalidasi regex yang digunakan dalam Django 1.5.1:
Ini melakukan kedua alamat ipv4 dan ipv6 serta parameter port dan GET.
Ditemukan dalam kode di sini , Baris 44.
sumber
Saya menemukan Regex untuk URL berikut, yang berhasil diuji dengan 500+ URL :
/\b(?:(?:https?|ftp):\/\/)(?:\S+(?::\S*)?@)?(?:(?!10(?:\.\d{1,3}){3})(?!127(?:\.\d{1,3}){3})(?!169\.254(?:\.\d{1,3}){2})(?!192\.168(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)(?:\.(?:[a-z\x{00a1}-\x{ffff}0-9]+-?)*[a-z\x{00a1}-\x{ffff}0-9]+)*(?:\.(?:[a-z\x{00a1}-\x{ffff}]{2,})))(?::\d{2,5})?(?:\/[^\s]*)?\b/gi
Saya tahu itu terlihat jelek, tetapi hal baiknya adalah ia bekerja. :)
Penjelasan dan demo dengan 581 URL acak di regex101.
Sumber: Mencari regex validasi URL yang sempurna
sumber
/(https?):\/\/([\w-]+(\.[\\w-]+)*\.([a-z]+))(([\w.,@?^=%&:\/~+#()!-]*)([\w@?^=%&\/~+#()!-]))?/gi
Saya mencoba merumuskan versi url saya. Persyaratan saya adalah untuk menangkap instance dalam sebuah String di mana url yang mungkin dapat cse.uom.ac.mu - mencatat bahwa itu tidak didahului oleh http atau www
sumber
ht{2}ps?
ituhttps?
apa yang salah dengan FILTER_VALIDATE_URL polos dan sederhana?
Saya tahu ini bukan pertanyaannya persis tetapi itu berhasil bagi saya ketika saya perlu memvalidasi url jadi saya pikir ini mungkin berguna bagi orang lain yang menemukan posting ini mencari hal yang sama
sumber
RegEx berikut ini akan berfungsi:
sumber
Gunakan yang ini berfungsi untuk saya
sumber
Untuk kenyamanan, inilah regexp satu-liner untuk URL yang juga akan cocok dengan localhost di mana Anda lebih cenderung memiliki port daripada
.com
atau serupa.sumber
Anda tidak menentukan bahasa yang Anda gunakan. Jika PHP, ada fungsi asli untuk itu:
Mengembalikan data yang difilter, atau SALAH jika filter gagal.
Periksa di sini >>
Semoga ini bisa membantu.
sumber