URL yang diberikan (satu baris):
http://test.example.com/dir/subdir/file.html
Bagaimana saya bisa mengekstrak bagian-bagian berikut ini dengan menggunakan ekspresi reguler:
- Subdomain (tes)
- Domain (example.com)
- Path tanpa file (/ dir / subdir /)
- File (file.html)
- Path dengan file (/dir/subdir/file.html)
- URL tanpa jalur ( http://test.example.com )
- (tambahkan yang lain yang menurut Anda akan berguna)
Regex harus berfungsi dengan benar bahkan jika saya memasukkan URL berikut:
http://example.example.com/example/example/example.html
CrackUrl
. Jika fungsi seperti itu ada, gunakan, itu hampir dijamin lebih dapat diandalkan dan lebih efisien daripada kode kerajinan tangan.Jawaban:
Anda selanjutnya dapat menguraikan host ('.' dibatasi) dengan cukup mudah.
Apa yang akan saya lakukan adalah menggunakan sesuatu seperti ini:
selanjutnya mengurai 'sisanya' untuk menjadi sespesifik mungkin. Melakukannya dalam satu regex, well, agak gila.
sumber
(.*)?
Karena bintang Kleene sudah menerima 0 atau lebih,?
bagian (0 atau 1) membingungkan itu. Saya memperbaikinya dengan mengubah(.*)?
ke(.+)?
. Anda juga bisa menghapus?
http://www.example.com:8080/....
:^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?(:\d+)?)($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((http[s]?|ftp):\/\/)?\/?([^\/\.]+\.)*?([^\/\.]+\.[^:\/\s\.]{2,3}(\.[^:\/\s\.]{2,3})?)(:\d+)?($|\/)([^#?\s]+)?(.*?)?(#[\w\-]+)?$
^((?P<scheme>[^:/?#]+):(?=//))?(//)?(((?P<login>[^:]+)(?::(?P<password>[^@]+)?)?@)?(?P<host>[^@/?#:]*)(?::(?P<port>\d+)?)?)?(?P<path>[^?#]*)(\?(?P<query>[^#]*))?(#(?P<fragment>.*))?
code
Anda menunjukkan kode ini dalam aksi di pythex.orgSaya menyadari bahwa saya terlambat ke pesta, tetapi ada cara sederhana untuk membiarkan browser mengurai url untuk Anda tanpa regex:
sumber
http://
, untuk menampilkan protokol, host dan nama host properti yang benar. Kalau tidak, awal url sampai slash pertama masuk ke properti protokol.var url = new URL(someUrl)
Saya terlambat beberapa tahun ke pesta, tetapi saya terkejut tidak ada yang menyebutkan spesifikasi Uniform Resource Identifier memiliki bagian tentang penguraian URI dengan ekspresi reguler . Ekspresi reguler, yang ditulis oleh Berners-Lee, et al., Adalah:
Untuk apa nilainya, saya menemukan bahwa saya harus melarikan diri dari garis miring di JavaScript:
^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?
sumber
1
:: Ini berkaitan dengan protokol lain, sepertiftp://
danmailto://
.2
: Ini berkaitan denganusername
dan denganpassword
. Kolom opsional ini dipisahkan oleh tanda titik dua, sama seperti nama host dan porta, dan itu akan melompati sebagian besar regex lain yang pernah saya lihat. @RémyDAVID Querystring juga tidak diuraikan secara normal olehlocation
objek browser . Jika Anda perlu menguraikan string kueri, lihat di perpustakaan kecil saya untuk itu: uqs .user:[email protected]
- RFC 3986 mengatakan:A path segment that contains a colon character (e.g., "this:that") cannot be used as the first segment of a relative-path reference, as it would be mistaken for a scheme name. Such a segment must be preceded by a dot-segment (e.g., "./this:that") to make a relative- path reference.
Saya menemukan jawaban tertinggi (jawaban hometoast) tidak berfungsi dengan baik untuk saya. Dua masalah:
Berikut ini adalah versi yang dimodifikasi:
Posisi bagian adalah sebagai berikut:
Edit yang diposting oleh pengguna lain:
sumber
http://www.example.com
atau jika lintasan itu seperti satu karakterhttp://www.example.com/a
.Saya membutuhkan Ekspresi reguler untuk mencocokkan semua url dan membuat yang ini:
Ini cocok dengan semua url, protokol apa pun, bahkan seperti url
Hasilnya (dalam JavaScript) terlihat seperti ini:
Seperti url
terlihat seperti ini:
sumber
/(?:([^\:]*)\:\/\/)?(?:([^\:\@]*)(?:\:([^\@]*))?\@)?(?:([^\/\:]*))?(?:\:([0-9]*))?\/(\/[^\?#]*(?=.*?\/)\/)?([^\?#]*)?(?:\?([^#]*))?(?:#(.*))?/
Saya mencoba menyelesaikan ini dalam javascript, yang harus ditangani oleh:
sejak (di Chrome, setidaknya) ia diuraikan menjadi:
Namun, ini bukan peramban silang ( https://developer.mozilla.org/en-US/docs/Web/API/URL ), jadi saya menggabungkan ini untuk menarik bagian yang sama seperti di atas:
Kredit untuk regex ini diberikan kepada https://gist.github.com/rpflorence yang memposting jsperf http://jsperf.com/url-parsing (awalnya ditemukan di sini: https://gist.github.com/jlong/2428561 # comment-310066 ) yang membuat regex ini awalnya berdasarkan.
Bagian-bagian ini dalam urutan ini:
Ada juga pustaka kecil yang membungkusnya dan menyediakan parameter permintaan:
https://github.com/sadams/lite-url (juga tersedia di bower)
Jika Anda memiliki peningkatan, harap buat permintaan tarik dengan lebih banyak tes dan saya akan menerima dan bergabung dengan terima kasih.
sumber
http://test1.dev.mydomain.com/
contoh itu akan menariktest1.dev.
.Usulkan solusi yang lebih mudah dibaca (dengan Python, tetapi berlaku untuk regex apa pun):
Cetakan:
sumber
subdomain dan domain sulit karena subdomain dapat memiliki beberapa bagian, seperti halnya domain tingkat atas, http://sub1.sub2.domain.co.uk/
(Penurunan harga tidak sangat ramah untuk regex)
sumber
(http(s?)://[^/]+/)
untuk juga mengambil httpsVersi yang ditingkatkan ini harus bekerja dengan andal sebagai pengurai.
sumber
Coba yang berikut ini:
Ini mendukung HTTP / FTP, subdomain, folder, file dll.
Saya menemukannya dari pencarian google cepat:
http://geekswithblogs.net/casualjim/archive/2005/12/01/61722.aspx
sumber
Dari jawaban saya pada pertanyaan serupa . Bekerja lebih baik daripada beberapa yang lain karena mereka memiliki beberapa bug (seperti tidak mendukung nama pengguna / kata sandi, tidak mendukung nama file karakter tunggal, pengidentifikasi fragmen sedang rusak).
sumber
Anda bisa mendapatkan semua http / https, host, port, path serta permintaan dengan menggunakan objek Uri di .NET. tugas yang sulit adalah memecah host menjadi sub domain, nama domain dan TLD.
Tidak ada standar untuk melakukannya dan tidak bisa hanya menggunakan penguraian string atau RegEx untuk menghasilkan hasil yang benar. Pada awalnya, saya menggunakan fungsi RegEx tetapi tidak semua URL dapat menguraikan subdomain dengan benar. Cara praktiknya adalah dengan menggunakan daftar TLD. Setelah TLD untuk URL ditentukan, bagian kiri adalah domain dan sisanya adalah sub domain.
Namun daftar ini perlu dipertahankan karena TLD baru dimungkinkan. Saat ini yang saya tahu adalah publicsuffix.org mempertahankan daftar terbaru dan Anda dapat menggunakan alat parser domainname dari kode google untuk mem-parsing daftar sufiks publik dan mendapatkan sub domain, domain dan TLD dengan mudah menggunakan objek DomainName: domainName.SubDomain, domainName .Domain dan domainName.TLD.
Jawaban ini juga membantu: Dapatkan subdomain dari URL
CaLLMeLaNN
sumber
Ini adalah salah satu yang lengkap, dan tidak bergantung pada protokol apa pun.
Cetakan
sumber
Tidak satu pun di atas bekerja untuk saya. Inilah yang akhirnya saya gunakan:
sumber
Saya suka regex yang diterbitkan dalam "Javascript: The Good Parts". Tidak terlalu pendek dan tidak terlalu rumit. Halaman ini di github juga memiliki kode JavaScript yang menggunakannya. Tapi itu bisa diadaptasi untuk bahasa apa pun. https://gist.github.com/voodooGQ/4057330
sumber
Java menawarkan kelas URL yang akan melakukan ini. Objek URL Kueri.
Sebagai catatan, PHP menawarkan parse_url () .
sumber
Saya akan merekomendasikan tidak menggunakan regex. Panggilan API seperti WinHttpCrackUrl () kurang rentan kesalahan.
http://msdn.microsoft.com/en-us/library/aa384092%28VS.85%29.aspx
sumber
Saya mencoba beberapa di antaranya yang tidak memenuhi kebutuhan saya, terutama yang terpilih tertinggi yang tidak mendapatkan url tanpa jalur ( http://example.com/ )
juga kurangnya nama grup membuatnya tidak dapat digunakan (atau mungkin keterampilan jinja2 saya kurang).
jadi ini versi saya yang sedikit dimodifikasi dengan sumbernya menjadi versi pilihan tertinggi di sini:
sumber
Menggunakan http://www.fileformat.info/tool/regex.htm regex hometoast berfungsi dengan baik.
Tapi ini masalahnya, saya ingin menggunakan pola regex yang berbeda dalam situasi yang berbeda dalam program saya.
Misalnya, saya memiliki URL ini, dan saya memiliki enumerasi yang mencantumkan semua URL yang didukung dalam program saya. Setiap objek dalam enumerasi memiliki metode getRegexPattern yang mengembalikan pola regex yang kemudian akan digunakan untuk membandingkan dengan URL. Jika pola regex tertentu mengembalikan true, maka saya tahu bahwa URL ini didukung oleh program saya. Jadi, setiap enumerasi memiliki regex sendiri tergantung pada di mana seharusnya terlihat di dalam URL.
Saran Hometoast sangat bagus, tetapi dalam kasus saya, saya pikir itu tidak akan membantu (kecuali saya menyalin tempel regex yang sama di semua enumerasi).
Itu sebabnya saya ingin jawaban untuk memberikan regex untuk setiap situasi secara terpisah. Meskipun +1 untuk di rumah. ;)
sumber
Saya tahu Anda mengklaim agnostik bahasa untuk hal ini, tetapi dapatkah Anda memberi tahu kami apa yang Anda gunakan agar kami tahu kemampuan regex apa yang Anda miliki?
Jika Anda memiliki kemampuan untuk pertandingan yang tidak menangkap, Anda dapat mengubah ekspresi hometoast sehingga subekspresi yang tidak Anda minati diatur seperti ini:
(?:SOMESTUFF)
Anda masih harus menyalin dan menempel (dan sedikit memodifikasi) Regex ke banyak tempat, tetapi ini masuk akal - Anda tidak hanya memeriksa untuk melihat apakah subekspresi itu ada, tetapi jika ada sebagai bagian dari URL . Menggunakan pengubah non-menangkap untuk subekspresi dapat memberi Anda apa yang Anda butuhkan dan tidak lebih, yang, jika saya membaca Anda dengan benar, adalah apa yang Anda inginkan.
Sama seperti catatan kecil, ekspresi hometoast tidak perlu menempatkan tanda kurung di sekitar 'untuk' https ', karena ia hanya memiliki satu karakter di sana. Bilangan kuantitatif menghitung satu karakter (atau kelas karakter atau subekspresi) langsung sebelum mereka. Begitu:
https?
akan cocok dengan 'http' atau 'https' dengan baik.
sumber
regexp untuk mendapatkan jalur URL tanpa file.
url = ' http: // domain / dir1 / dir2 / somefile ' url.scan (/ ^ (http: // [^ /] +) ((?: / [^ /] +) +) + (? = /)) ? /? (?: [^ /] +)? $ / i) .to_s
Ini dapat berguna untuk menambahkan jalur relatif ke url ini.
sumber
Regex untuk melakukan parsing penuh cukup menghebohkan. Saya telah memasukkan referensi balik yang dinamai untuk keterbacaan, dan memecah setiap bagian menjadi baris yang berbeda, tetapi masih terlihat seperti ini:
Hal yang mengharuskannya begitu bertele-tele adalah bahwa kecuali untuk protokol atau port, setiap bagian dapat berisi entitas HTML, yang membuat penggambaran fragmen cukup rumit. Jadi dalam beberapa kasus terakhir - host, path, file, querystring, dan fragmen, kami mengizinkan entitas html atau karakter apa pun yang bukan a
?
atau#
. Regex untuk entitas html terlihat seperti ini:Ketika itu diekstraksi (saya menggunakan sintaksis kumis untuk mewakilinya), itu menjadi sedikit lebih terbaca:
Dalam JavaScript, tentu saja, Anda tidak bisa menggunakan referensi bernama, jadi regex menjadi
dan di setiap kecocokan, protokolnya adalah
\1
, host-nya\2
, port-nya\3
, path\4
, file\5
, querystring\6
, dan fragmen\7
.sumber
sumber
Saya mencoba regex ini untuk mem-parsing partisi url:
URL:
https://www.google.com/my/path/sample/asd-dsa/this?key1=value1&key2=value2
Cocok:
sumber
Akan memberikan output berikut:
1: https: //
2: www.thomas-bayer.com
3: /
4: axis2 / services / BLZService? Wsdl
Jika Anda mengubah URL ke
String s = " https: //www.thomas -bayer.com?wsdl=qwerwer&ttt=888 "; hasilnya adalah sebagai berikut:
1: https: //
2: www.thomas-bayer.com
3 :?
4: wsdl = qwerwer & ttt = 888
selamat menikmati .. Yosi Lev
sumber