Karakter yang membuat URL yang tidak valid?
Ini Url yang valid?
example.com/file[/].html
http://example.com/file[/].html
Secara umum Uri seperti yang didefinisikan oleh RFC 3986 (lihat Bagian 2: Karakter) dapat berisi salah satu dari berikut 84 karakter:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-._~:/?#[]@!$&'()*+,;=
Perhatikan bahwa daftar ini doesn't negara mana di URI karakter ini dapat terjadi.
Karakter lain kebutuhan akan dikodekan dengan persen-encoding (%
jj
). Setiap bagian dari URI memiliki pembatasan lebih lanjut tentang karakter apa yang harus diwakili oleh seorang persen-dikodekan kata.
Untuk menambahkan beberapa klarifikasi dan langsung menjawab pertanyaan di atas, ada beberapa kelas karakter yang menyebabkan masalah untuk Url dan Uri.
Ada beberapa karakter yang dianulir dan harus tidak pernah muncul di URL/URI, pendiam karakter (dijelaskan di bawah), dan karakter lain yang dapat menyebabkan masalah dalam beberapa kasus, tetapi ditandai sebagai "bijaksana" atau "aman". Penjelasan mengapa karakter-karakter yang dibatasi secara jelas dijabarkan pada RFC 1738 (Url) dan RFC-2396 (Uri). Catatan baru RFC-3986 (update RFC 1738) mendefinisikan pembangunan karakter apa yang diperbolehkan dalam konteks tertentu tetapi lebih tua spec menawarkan lebih sederhana dan lebih umum deskripsi karakter yang tidak diperbolehkan dengan aturan berikut.
Dikecualikan US-ASCII dianulir dalam URI sintaks:
control = <US-ASCII coded characters 00-1F and 7F hexadecimal>
space = <US-ASCII coded character 20 hexadecimal>
delims = "<" | ">" | "#" | "%" | <">
Karakter "#" dikecualikan karena hal ini digunakan untuk membatasi URI dari sebuah fragmen pengenal. Karakter persen "%" dikecualikan karena digunakan untuk pengkodean karakter melarikan diri. Dengan kata lain, "#" dan "%" dicadangkan karakter yang harus digunakan dalam konteks tertentu.
Daftar bijaksana karakter yang diperbolehkan tetapi dapat menyebabkan masalah:
unwise = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"
Karakter yang reserved dalam query komponen dan/atau memiliki arti khusus dalam URI/URL:
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","
&Quot;undang" sintaks kelas atas mengacu pada karakter-karakter yang diperbolehkan hanya URI, tetapi yang mungkin tidak akan diizinkan hanya komponen tertentu dari generic URI sintaks. Karakter dalam "undang" tidak dilindungi dalam semua konteks. Hostname, misalnya, bisa mengandung opsional username jadi ini bisa menjadi sesuatu seperti ftp://user@hostname/
mana '@' karakter memiliki arti khusus.
Berikut ini adalah contoh dari URL yang tidak valid dan tidak bijaksana karakter (mis.'$', '[', ']') dan harus benar dikodekan:
http://mw1.google.com/mw-earth-vectordb/kml-samples/gp/seattle/gigapxl/$[level]/r$[y]_c$[x].jpg
Beberapa batasan karakter untuk Uri/Url adalah bahasa pemrograman yang tergantung. Misalnya, '|' (0x7C) karakter meskipun hanya ditandai sebagai "bijaksana" di URI spec akan melempar URISyntaxException Jawa jawa.net.URI konstruktor jadi URL seperti http://api.google.com/q?exp=a/b
tidak diperbolehkan dan harus dikodekan bukan sebagai http://api.google.com/q?exp=a%7Cb
jika menggunakan Java dengan URI contoh objek.
Sebagian besar ada jawaban di sini adalah tidak praktis karena mereka benar-benar mengabaikan dunia nyata penggunaan alamat seperti:
Per ini baru arti dari "URL", karakter apa yang diperbolehkan? Di banyak bagian-bagian dari URL, seperti query string dan jalan, kita're diperbolehkan untuk menggunakan sewenang-wenang "URL unit", yang
URL poin kode dan persen-dikodekan bytes. Apa "URL poin kode"? URL poin kode ASCII alfanumerik, U+0021 (!), U+0024 ($), U+0026 (&), U+0027 ('), U+0028 KURUNG KIRI, U+0029 KURUNG KANAN, U+002A (), U+002B (+), U+002C (,), U+002D (-), U+002E (.), U+002F (/), U+003A (:), U+003B (;), U+003D (=), U+003F (?), U+0040 (@), U+005F (_), U+007E (~), dan kode poin di kisaran U+00A0 untuk U+10FFFD, inklusif, termasuk pengganti dan noncharacters. (Perhatikan bahwa daftar "URL poin kode" tidak't seperti
%
, tapi%
s yang diperbolehkan dalam "URL kode unit" jika mereka're bagian dari persen-pengkodean urutan.) Satu-satunya tempat aku bisa melihat di mana spec izin penggunaan dari setiap karakter yang's tidak* dalam set ini adalah di host, dimana alamat IPv6 yang tertutup dalam[
dan]
karakter. Di tempat lain di URL, baik URL unit yang diperbolehkan atau bahkan lebih ketat mengatur karakter.Apa karakter yang diizinkan di bawah tua Rfc?
Demi sejarah, dan karena itu's tidak dieksplorasi sepenuhnya di tempat lain dalam jawaban di sini, let's memeriksa diizinkan di bawah lebih tua pasangan spesifikasi. Pertama-tama, kita memiliki dua jenis RFC 3986 reserved karakter:
:/?#[]@
, yang merupakan bagian dari generic sintaks untuk URI yang didefinisikan dalam RFC 3986 **, yang tidak't bagian dari RFC's generik sintaks, tetapi dicadangkan untuk digunakan sebagai komponen sintaksis tertentu skema URI. Misalnya, titik koma dan koma digunakan sebagai bagian dari sintaks [Uri data](https://en.wikipedia.org/wiki/Data_URI_scheme), dan
&dan
=yang digunakan sebagai bagian dari mana-mana
?foo=bar&qux=bazformat dalam query string (yang *isn't* ditentukan oleh RFC 3986). Setiap karakter yang dilindungi di atas dapat secara legal digunakan di URI tanpa encoding, baik untuk melayani mereka sintaksis tujuan atau hanya sebagai literal karakter dalam data di beberapa tempat di mana penggunaan tersebut tidak bisa disalahartikan sebagai karakter yang menyajikan sintaksis tujuan. (Misalnya, meskipun
/` memiliki sintaksis makna dalam URL, anda dapat menggunakannya tidak dienkode dalam query string, karena itu doesn't memiliki makna dalam query string.)
RFC 3986 juga menentukan beberapa tanpa syarat karakter, yang selalu dapat digunakan hanya untuk mewakili data tanpa encoding: abcdefghijklmnopqrstuvwxyzABCDEFghijklmnopqrstuvwxyz0123456789-._~
Akhirnya, %
karakter sendiri diperbolehkan untuk persen-pengkodean.
Bahwa daun hanya mengikuti karakter ASCII yang dilarang muncul di URL: "<>\^`{|}
Setiap karakter ASCII dapat secara legal fitur dalam URL.
Kemudian RFC 3987 meluas bahwa set unreserved karakter dengan karakter unicode berikut berkisar: %xA0-D7FF / %xF900-FDCF / %xFDF0-FFEF
/ %x10000-1FFFD / %x20000-2FFFD / %x30000-3FFFD
/ %x40000-4FFFD / %x50000-5FFFD / %x60000-6FFFD
/ %x70000-7FFFD / %x80000-8FFFD / %x90000-9FFFD
/ %xA0000-AFFFD / %xB0000-BFFFD / %xC0000-CFFFD
/ %xD0000-DFFFD / %xE1000-EFFFD
Akhirnya, it's mungkin dicatat bahwa hanya mengetahui karakter yang secara legal dapat muncul di URL isn't cukup untuk mengenali apakah beberapa string tertentu adalah hukum URL atau tidak, karena beberapa karakter yang hanya legal di bagian-bagian tertentu dari URL. Misalnya, karakter yang dilindungi [
dan ]
hukum sebagai bagian dari IPv6 literal host di URL seperti http://[1080::8:800:200C:417A]/foo tapi aren't hukum di dalam konteks yang lain, sehingga OP's contoh http://example.com/file[/].html
adalah ilegal.
Dalam tambahan pertanyaan anda bertanya apakah www.example.com/file[/].html
adalah URL yang valid.
URL yang isn't valid karena URL adalah jenis URI dan URI valid harus memiliki skema seperti http:
(lihat RFC 3986).
Jika anda ingin bertanya jika http://www.example.com/file[/].html
adalah URL yang valid maka jawabannya adalah masih ada karena braket persegi karakter aren't berlaku di sana.
Braket persegi karakter yang disediakan untuk Url dalam format ini: http://[2001:db8:85a3::8a2e:370:7334]/foo/bar
(yaitu IPv6 literal bukan nama host)
It's layak membaca RFC 3986 hati-hati jika anda ingin memahami masalah ini sepenuhnya.
Semua valid karakter yang dapat digunakan dalam URI (URL adalah jenis URI) yang didefinisikan pada RFC 3986.
Semua karakter lain yang dapat digunakan dalam URL yang disediakan bahwa mereka "URL Dikodekan" pertama. Ini melibatkan mengubah karakter yang tidak valid untuk menemukan "kode" (biasanya dalam bentuk persen simbol (%) diikuti dengan nomor heksadesimal).
Link ini, HTML URL Encoding Referensi, berisi daftar pengkodean untuk karakter yang tidak valid.
Beberapa karakter Unicode berkisar valid HTML5, meskipun mungkin masih belum menjadi ide yang baik untuk menggunakan mereka.
E. g., href
docs mengatakan http://www.w3.org/TR/html5/links.html#attr-hyperlink-href:
atribut href pada dan daerah elemen harus memiliki nilai yang lebih valid URL berpotensi dikelilingi oleh spasi.
Kemudian definisi dari "URL yang sah" poin untuk http://url.spec.whatwg.org/, yang mengatakan hal ini bertujuan untuk:
Menyelaraskan RFC 3986 dan RFC 3987 dengan kontemporer implementasi dan usang mereka dalam proses.
Dokumen yang mendefinisikan URL poin kode sebagai:
ASCII alfanumerik, "!", "$", "&" ",'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "=", "?", "@", "_", "~", dan kode poin di kisaran U+00A0 untuk U+D7FF, U+E000 untuk U+FDCF, U+FDF0 untuk U+FFFD, U+10000 untuk U+1FFFD, U+20000 untuk U+2FFFD, U+30000 untuk U+3FFFD, U+40000 U+4FFFD, U+50000 ke U+5FFFD, U+60000 untuk U+6FFFD, U+70000 untuk U+7FFFD, U+80000 untuk U+8FFFD, U+90000 untuk U+9FFFD, U+A0000 untuk U+AFFFD, U+B0000 untuk U+BFFFD, U+C0000 untuk U+CFFFD, U+D0000 untuk U+DFFFD, U+E1000 untuk U+EFFFD, U+F0000 untuk U+FFFFD, U+100000 untuk U+10FFFD.
Istilah "URL poin kode" ini kemudian digunakan dalam pernyataan ini:
Jika c bukan URL kode titik dan tidak "%", kesalahan parse.
dalam beberapa bagian dari algoritma parsing, termasuk skema, wewenang, path relatif, query dan fragmen serikat: jadi pada dasarnya seluruh URL.
Juga, validator http://validator.w3.org/ tiket untuk Url seperti "你好"
, dan tidak lulus untuk Url dengan karakter seperti ruang "b"
Tentu saja, seperti yang disebutkan oleh Stephen C, hal ini tidak hanya tentang karakter tetapi juga tentang konteks: anda harus memahami seluruh algoritma. Tapi sejak kelas "URL poin kode" ini digunakan pada poin-poin penting dari algoritma yang memberikan ide yang baik dari apa yang dapat anda gunakan atau tidak.
Lihat juga: https://stackoverflow.com/questions/2742852/unicode-characters-in-urls
Saya perlu untuk memilih karakter untuk membagi url string, jadi saya memutuskan untuk membuat daftar dari karakter yang tidak dapat ditemukan di URL sendiri:
>>> allowed = "-_.~!*'();:@&=+$,/?%#[]?@ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
>>> from string import printable
>>> ''.join(set(printable).difference(set(allowed)))
'`" <\x0b\n\r\x0c\\\t{^}|>'
Jadi, pilihan yang mungkin adalah newline, tab, spasi, backslash dan "<>{}^|
. Saya kira saya'll pergi dengan spasi atau baris baru. :)
Tidak benar-benar jawaban untuk pertanyaan anda tapi memvalidasi url's adalah benar-benar serius p.aku.t.a Anda're mungkin hanya lebih baik dari memvalidasi domainname dan meninggalkan query bagian dari url yang sama. Itu adalah pengalaman saya. Anda juga bisa resor untuk ping url dan melihat jika itu menghasilkan respon yang valid tapi itu mungkin terlalu banyak untuk suatu tugas sederhana.
Ekspresi reguler untuk mendeteksi url's yang melimpah, google itu :)
Saya datang dengan beberapa ekspresi reguler untuk PHP yang akan mengkonversi url dalam teks dengan tag anchor. (Pertama itu mengkonversi semua www. url http:// kemudian mengubah semua url dengan https?:// untuk a href=... link html
$string = preg_replace('/(https?:\/\/)([!#$&-;=?\-\[\]_a-z~%]+)/sim', '<a href="$1$2">$2</a>', preg_replace('/(s)((www\.)([!#$&-;=?\-\[\]_a-z~%]+))/sim', '$1http://$2', $string) );