JavaScript'te en kısa URL normal ifadesi eşleşmesi


16

JavaScript'te çalıştırıldığında metindeki bir URL ile kabaca eşleşen en kısa normal ifadeyi oluşturun

Misal:

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

Normal ifadenin

  • http ve https için geçerli tüm URL'leri yakalayın .
  • aslında geçerli URL'ler olmayan URL görünümlü dizelerle eşleşmekten endişe etmeyin super.awesome/cool
  • JavaScript normal ifadesi olarak çalıştırıldığında geçerli olma

Test kriterleri:

Eşleşme:

Eşleşmiyor:

  • misal
  • Süper havalı
  • Günaydın
  • yapabilirim
  • Merhaba.

İşte biraz açıklığa kavuşturabilecek bir test http://jsfiddle.net/MikeGrace/gsJyr/

Açıklık eksikliği için özür dilerim, eşleşen URL'lerin ne kadar korkunç olduğunu fark etmemiştim.


Ahgrrrr! Düzenleme ayrıcalıklarımı özledim! Oyunu tek bir dille sınırlandıracağım, belki de o dille etiketlemelisiniz.
dmckee --- eski moderatör kedi yavrusu

Geçerli bir URL karakteri nedir? çünkü \wher şey için basitçe kullanabiliyorum Farklı URL bileşenleri için geri başvurular mı bekliyorsunuz?
Ming-Tang

1
RFC 2396'ya göre "Bir URI, çok sınırlı bir kümedeki bir karakter dizisidir, yani temel Latin alfabesinin harfleri, rakamları ve birkaç özel karakterdir ."
RunnerRick

Mike: Sanırım hâlâ düzenli bir açıklama var. Şimdi /:/olduğu gibi, sadece normal ifade olarak kullanabilir ve geçerli URI'lerle eşleşebilir ve »Eşleşmiyor« listesindeki tüm örneklerinizle eşleşmeyebilirim. Bu rotaya gittiğiniz sürece sadece soru şudur: Örnek dizelerden hiçbiriyle eşleşmeyecek, ancak yine de tüm URI'leri yakalayacak en kısa düzenli ifade nedir.
Joey

1
Daha fazla ayrıntıyla daha uzun bir meydan okuma yazmaya çalışın.

Yanıtlar:


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

olmaması gereken 3 dizeyle eşleşmiyor, neredeyse her şeyle eşleşiyor;)
upd: yine de 5 ile eşleşmiyor


14

Bu işe yarıyor:

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)
*/

Testleri http://jsfiddle.net/9BYdp/1/ adresinden geçer.

Ayrıca eşleşmeler:

  • example.com. (sondaki nokta)
  • example.com:8080 (bağlantı noktası)

Tatlılık!!!!!!!
Mike Grace

2
Bir ana bilgisayar adını da yalnızca bir bileşenle (örn. Localhost) eşleştirmek istemez misiniz?
RunnerRick

Bu alanlara izin verir
brenjt

benim için çalışıyor. ty :)
ÇELİK

Güzel çalışıyor, ancak kullanıcı / şifre bölümleri olan alanlar için değil, örn.http://user:password@domain.com/path
Radon8472

5

Bu kesinlikle niyet ettiğiniz şeyi yapmaz, ancak kriterlerinizi karşılar:

 /.*/
  • "http ve https için geçerli tüm URL'lerle eşleşmelidir."

    evet, kesinlikle eşleşecek.

  • "aslında 'super.awesome / cool' gibi geçerli URL'ler olmayan URL görünümlü dizelerle eşleşmekten endişe etmeyin"

    evet, elbette, çok sayıda yanlış pozitif olacak, ama bunun önemli olmadığını söyledin.

  • JavaScript normal ifadesi olarak çalıştırıldığında geçerli olma

    emin yumurta söylemek istediğiniz gibi çalışır.

Bu sonuç doğru bir cevap DEĞİLSE, kriterleriniz konusunda daha seçici olmanız gerekir.

Amacıyla aslında, senin kadar eserler niyetinde bu bir kural olarak yapmak tam RFC uyumlu eşleyici uygulanması gereğini ve tam RFC uyumlu eşleştirici olacak "eşleşmeyen hakkında endişe".

Bu nedenle, "izin vermeme izni" açısından, RFC'den hangi sapmalara izin verileceğini tam olarak belirtmeniz gerekir .

Başka bir şey ve tüm bu egzersiz bir sahte, çünkü insanlar sadece onlar için neyin işe yaradığını ya da nasıl sevdiklerini yazacaklar ve "herhangi bir anlam ifade etmeyi" kısaca olmaktan (benim yaptığım gibi) feda edecekler.

Güncellemenizde

Yaptığım en naif regex, şu ana kadar yapıştırılan tüm örneklerinizle eşleşiyor (ve yakalanıyor):

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

Doğada oldukça basittir ve sadece 3 temel formun mümkün olduğunu varsayar.

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

zboşluk değil bir şey olabilir. xboşluk olmayan herhangi bir şey olabilir. yboşluk veya '/' karakteri olmayan herhangi bir şey olabilir.

Bu kural için geçerli olacak bir çok şey var, çok, ama en azından bir insan için geçerli bir URI gibi görünecekler , sadece spesifikasyonlarla uyumlu olmayacaklar.

Örneğin:

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

Bence aklı başında yaklaşım URI's olması muhtemel şeyler ayıklamak, sonra onları daha sıkı bir şey ile doğrulamak olduğunu düşünüyorum, ben onları doğrulamak için tarayıcılar URI sınıfı nasıl kullanılacağı üzerinde çalışıyorum =).

Ancak yukarıdaki mantığın bu örnek üzerinde çalıştığını burada görebilirsiniz: http://jsfiddle.net/mHbXx/


Soruyu değiştirdi, ancak /:/düzenlemeden sonra bile daha iyisini yapabilirsin :-)
Joey

Teşekkürler Mike =). Kendimi daha ciddi bir şekilde rekabet etmek istemiyorum, diğer öneriler daha faydalı, sadece ilk öncül problemi işaret etmek istedim, böylece soru kalitesi
artabilir

Yalnızca ben mi yoksa bu "www .google .com" ile eşleşiyor mu?
Schiavini

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

Bunu dene.

Düzenli ifadeyi sınırlayan önde gelen ve sondaki eğik çizgileri ekliyorum, umarım karakter sayımı incitmez!

Bu desen protokolü http veya https ile sınırlar, isteğe bağlı bir bağlantı noktası numarasına izin verir ve sonra boşluk dışında herhangi bir karaktere izin verir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.