Pencocokan regex URL terpendek dalam JavaScript


16

Buat ekspresi reguler terpendek yang kira-kira akan cocok dengan URL dalam teks saat dijalankan dalam JavaScript

Contoh:

"some text exampley.com".match(/your regular expression goes here/);

Ekspresi reguler perlu

  • tangkap semua URL yang valid untuk http dan https.
  • tidak khawatir tentang tidak cocok dengan string mencari URL yang sebenarnya bukan URL yang valid super.awesome/cool
  • valid ketika dijalankan sebagai regex JavaScript

Kriteria pengujian:

Pertandingan:

Tidak cocok:

  • contoh
  • sangat keren
  • Selamat pagi
  • saya bisa
  • Halo.

Berikut ini adalah tes yang mungkin membantu sedikit memperjelas http://jsfiddle.net/MikeGrace/gsJyr/

Saya minta maaf karena tidak jelasnya, saya tidak menyadari betapa buruknya URL yang cocok.


Ahgrrrr! Saya kehilangan hak mengedit saya! Saya akan membatasi permainan ke satu bahasa, mungkin Anda harus menandainya dengan bahasa itu.
dmckee

Apa yang merupakan karakter URL yang valid? karena saya cukup menggunakan \wuntuk semuanya. Apakah Anda mengharapkan referensi untuk komponen URL yang berbeda?
Ming-Tang

1
"URI adalah urutan karakter dari himpunan yang sangat terbatas, yaitu huruf-huruf alfabet Latin dasar, angka, dan beberapa karakter khusus," menurut RFC 2396 .
RunnerRick

Mike: Saya kira masih ada beberapa klarifikasi. Seperti yang ada sekarang, saya hanya dapat menggunakan /:/sebagai ekspresi reguler dan mencocokkan URI yang valid dan tidak cocok dengan semua contoh Anda pada daftar »Tidak cocok«. Selama Anda menempuh rute itu, itu hanyalah pertanyaan: Apa ekspresi reguler terpendek yang tidak akan cocok dengan string contoh mana pun tetapi masih menangkap semua URI.
Joey

1
Cobalah untuk menulis tantangan yang lebih panjang dengan lebih banyak detail.

Jawaban:


1
/.+\.\w\w.*/

tidak cocok dengan 3 string yang seharusnya tidak cocok dengan hampir semua string lainnya;)
upd: masih tidak cocok dengan semua 5 string


14

Yang ini berfungsi:

var re = /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi;

/*
(^|\s)                            : ensure that we are not matching an url 
                                    embeded in an other string
(https?:\/\/)?                    : the http or https schemes (optional)
[\w-]+(\.[\w-]+)+\.?              : domain name with at least two components;
                                    allows a trailing dot
(:\d+)?                           : the port (optional)
(\/\S*)?                          : the path (optional)
*/

Lulus tes di http://jsfiddle.net/9BYdp/1/

Juga cocok:

  • example.com. (trailing dot)
  • example.com:8080 (port)

Rasa manis!!!!!!!
Mike Grace

2
Tidakkah Anda ingin mencocokkan nama host dengan hanya satu komponen juga (misalnya localhost)?
RunnerRick

Ini memungkinkan spasi
brenjt

bekerja untukku. ty :)
STEEL

Berfungsi bagus, tetapi tidak untuk domain dengan bagian pengguna / kata sandi misalnyahttp://user:password@domain.com/path
Radon8472

5

Ini jelas tidak melakukan apa yang Anda inginkan, tetapi memenuhi kriteria Anda:

 /.*/
  • "cocok dengan semua URL yang valid yaitu untuk http dan https."

    ya, pasti akan cocok.

  • "Jangan khawatir tentang tidak cocok dengan string yang mencari URL yang sebenarnya bukan URL yang valid seperti 'super.awesome / keren'"

    ya, tentu, akan ada banyak positif palsu, tetapi Anda mengatakan itu tidak masalah.

  • valid ketika dijalankan sebagai regex JavaScript

    Pastikan telur berfungsi seperti yang Anda katakan seharusnya.

Jika hasil ini BUKAN jawaban yang benar, maka Anda harus lebih selektif dengan kriteria Anda.

Untuk menjadi aturan yang berfungsi sesuai keinginan Anda, sebenarnya Anda lakukan sesuai keinginan perlu menerapkan pencocokan yang memenuhi standar RFC, dan pencocokan yang memenuhi standar RFC akan "khawatir tidak cocok".

Jadi, dalam hal "izin tidak cocok", Anda harus menentukan dengan tepat penyimpangan dari RFC yang diizinkan.

Apa pun yang lain, dan seluruh latihan ini adalah bohong, karena orang hanya akan menulis apa pun yang sesuai untuk mereka, atau bagaimana mereka menyukainya, dan mengorbankan "yang masuk akal" demi menjadi pendek (seperti yang saya lakukan).

Tentang pembaruan Anda

Regex paling naif yang bisa saya buat dengan korek api (dan menangkap) semua contoh yang Anda tempelkan sejauh ini adalah:

/(\S+\.[^/\s]+(\/\S+|\/|))/g;

Sifatnya cukup sederhana, dan mengasumsikan hanya 3 bentuk dasar yang mungkin.

x.y
x.y/
x.y/z 

zbisa anthing bukan spasi putih. xbisa apa saja bukan spasi. ybisa berupa apa saja yang bukan spasi putih atau karakter '/'.

Ada banyak hal yang akan berlaku untuk aturan ini, banyak, tetapi mereka setidaknya akan terlihat seperti URI yang valid untuk manusia, mereka hanya tidak akan kompatibel dengan spesifikasi.

misalnya:

hello.0/1  # valid 
1.2/1 # valid 
muffins://¥.µ/€  # probably valid

Saya pikir pendekatan waras adalah mengekstraksi hal-hal yang kemungkinan menjadi URI, kemudian memvalidasinya dengan sesuatu yang lebih ketat, saya sedang mencari cara bagaimana menggunakan browser kelas URI untuk memvalidasi mereka =).

Tetapi Anda dapat melihat alasan di atas bekerja pada sampel ini di sini: http://jsfiddle.net/mHbXx/


Dia mengubah pertanyaan, tetapi Anda tetap bisa melakukannya dengan lebih baik /:/bahkan setelah diedit :-)
Joey

Terima kasih, Mike =). Saya tidak ingin bersaing dengan cara yang lebih serius, saran lain lebih berguna, saya hanya ingin menunjukkan masalah dengan premis awal sehingga kualitas pertanyaan dapat meningkat =)
Kent Fredric

Apakah hanya saya atau ini "www .google .com" yang cocok?
Schiavini

1
/https?\:\/\/\w+((\:\d+)?\/\S*)?/

Coba itu.

Saya termasuk garis miring yang mengarah dan mengekor yang membatasi ekspresi reguler, jadi mudah-mudahan itu tidak mengurangi jumlah karakter saya!

Pola ini membatasi protokol untuk http atau https, memungkinkan untuk nomor port opsional, dan kemudian memungkinkan karakter apa pun kecuali spasi.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.