Alt alan adı olmadan geçerli bir alan adıyla eşleşen normal ifade nedir?


123

Bir alan adını doğrulamam gerekiyor:

google.com

stackoverflow.com

Yani en ham haliyle bir alan adı - www gibi bir alt alan adı bile değil.

  1. Karakterler sadece az | AZ | 0-9 ve nokta (.) Ve kısa çizgi (-)
  2. Alan adı kısmı tire (-) ile başlamamalı veya bitmemelidir (örneğin -google-.com)
  3. Alan adı kısmı 1 ile 63 karakter arasında olmalıdır
  4. Uzantı (TLD) şimdilik 1 numaralı kuralın altındaki herhangi bir şey olabilir, onları daha sonra bir listeye göre doğrulayabilirim, 1 veya daha fazla karakter olsa da

Düzenleme: TLD görünüşte olduğu gibi 2-6 karakterdir

Hayır. 4 revize edildi: TLD, .co.uk gibi şeyleri içermesi gerektiği için aslında "alt alan adı" olarak etiketlenmelidir - Mümkün olan tek doğrulamanın (bir listeyle karşılaştırmanın dışında) 'ilk noktadan sonra bir tane olmalı veya 1. kural altında daha fazla karakter

Çok teşekkürler, inanın denedim!


1
Hiç yardımcı olmayabilir. Google.co.uk ve bazı Japonca alan adları söz konusu olduğunda, bunun için regex kullanmadan önce iki kez düşünmeniz gerekeceğinden eminim. Benim kişisel düşüncem, regex'in bir alanı gerçek hayattaki bir alana doğrulamak için yeterli olmadığıdır. Bilginize, işte tlds ve ülke kodu ikinci seviye alan adları listesinin neredeyse eksiksiz bir listesi: static.ayesh.me/misc/SO/tlds.txt
Ayesh K

1
Ana bilgisayar adı doğrulaması ile ilgili soruya verdiğim yanıtı görün .
SAM

2
Çoğu zaman unutulur: Tam nitelikli alan adları için, tld'den sonra bir nokta ile eşleşmelisiniz.
schmijos

1
4 yıl oldu, şimdi sayı
89.000'e çıktı

1
Bu cevaplardan bazıları oldukça iyi, ancak bu diğer soruya bakmaya değer başka bir iyi cevap daha var.
craftworkgames

Yanıtlar:


50

Eh, o oluyor oldukça basit sizin özel gereksinimleri göz önüne alındığında, (yorumlar) göründüğünden daha küçük sneakier:

/^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]{2,}$/

Ancak bunun birçok geçerli alanı reddedeceğini unutmayın.


Güzel teşekkürler, bu işe yarıyor gibi görünüyor. Ne tür alan adlarının doğrulamayı geçemeyeceğini biliyor musunuz?
Dominic

12
@infensus - Belirtimlerinize göre bu normal ifade doğru olsa da, belirtimleriniz yanlış. g.cogeçerli bir alan adıdır ancak gyalnızca bir karakterdir.
sch

3
Bu, düşündüğüm tüm durumlarla eşleşmelidir: ^ ([a-z0-9]) (([a-z0-9 -] {1,61})? [A-z0-9] {1})? (\. [a-0-9] (([a-z0-9 -]? {1,61}) [a-0-9] {1})?.) (\ [a-za-z] {2 , 4}) + $
transilvlad

1
x.com buradan geçemez
Neil McGuigan

4
@Neil: Haklısın. Orijinal soru 3-63 karakter istedi (bkz. Düzenleme 3). Oldukça kolay bir karakter alanlarını desteklemek için değiştirilebilir: /^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/. Ama bu yine de tonlarca geçerli şeyi reddediyor ...
Cameron

85

Bunun biraz eski bir gönderi olduğunu biliyorum, ancak buradaki tüm normal ifadelerde çok önemli bir bileşen eksik: IDN alan adları desteği.

IDN alan adları xn-- ile başlar. Alan adlarında genişletilmiş UTF-8 karakterlerini etkinleştirirler. Örneğin, "♡ .com" un geçerli bir alan adı olduğunu biliyor muydunuz? Evet, "aşk kalp nokta com"! Alan adını doğrulamak için, http://xn--c6h.com/ adresinin doğrulamayı geçmesine izin vermeniz gerekir .

Bu normal ifadeyi kullanmak için, alanı küçük harfe dönüştürmeniz ve ayrıca alan adlarını ACE'ye ("ASCII Uyumlu Kodlama" olarak da bilinir) kodladığınızdan emin olmak için bir IDN kitaplığı kullanmanız gerekeceğini unutmayın. İyi bir kitaplık GNU-Libidn'dir.

idn (1), uluslararasılaştırılmış alan adı kitaplığının komut satırı arayüzüdür. Aşağıdaki örnek, UTF-8'deki ana bilgisayar adını ACE kodlamasına dönüştürür. Sonuçta elde edilen URL https: //nic.xn--flw351e/ daha sonra https: // nic'in ACE kodlu eşdeğeri olarak kullanılabilir . 谷 歌 / .

  $ idn --quiet -a nic.谷歌
  nic.xn--flw351e

Bu sihirli normal ifade, çoğu alanı kapsamalıdır (yine de, kaçırdığım birçok geçerli uç durum olduğundan eminim):

^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.(xn--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})$

Bir etki alanı doğrulama normal ifadesi seçerken, alanın aşağıdakilerle eşleşip eşleşmediğini görmelisiniz:

  1. xn--stackoverflow.com
  2. stackoverflow.xn - com
  3. stackoverflow.co.uk

Bu üç alan geçmiyorsa, normal ifadeniz meşru alan adlarına izin vermiyor olabilir!

Check out Oracle'ın Uluslararası Dil Çevre Kılavuzu Uluslararası Alan Adları Destek sayfasını daha fazla bilgi için.

Burada normal ifadeyi denemekten çekinmeyin: http://www.regexr.com/3abjr

ICANN , bazı IDN etki alanlarının örneklerini görmek için kullanılabilen, yetkilendirilmiş tld'lerin bir listesini tutar .


Düzenle:

 ^(((?!-))(xn--|_{1,1})?[a-z0-9-]{0,61}[a-z0-9]{1,1}\.)*(xn--)?([a-z0-9][a-z0-9\-]{0,60}|[a-z0-9-]{1,30}\.[a-z]{2,})$

Bu normal ifade, ana bilgisayar adının sonunda '-' bulunan etki alanlarının geçerli olarak işaretlenmesini durduracaktır. Ek olarak, sınırsız alt alan adlarına izin verir.


1
Bunun yalnızca en fazla bir alt alan adını destekleyeceğini, bundan daha fazlasının yanlışla sonuçlanacağını unutmayın. Dahili siteler vb. İçin kullanmadıkça /^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{1,30})\.?[a-z]{2,})$/i
karalayacağınız bir

1
Ancak yalnız tld'ler çalışmıyor :( Örneğin to.( to. ) İçeriğe sahip geçerli
url'dir

@iiic, evet, ancak to.tam bir etki alanı adı değil. En üst düzey alan adlarına izin vermek istiyorsanız, o zaman gibi bir şey kullanmalısınız ^(((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,1}\.)?(x--)?([a-z0-9\-]{1,61}|[a-z0-9-]{1,30}\.[a-z]{2,})\.?$, ancak uyarılmalısınız, insanların testya da gibi alanlar eklemelerine izin vereceksiniz na!
Tim Groeneveld

Geçersiz invali.diken geçerli bir alan adı olarak kabul eder invali.d.co.uk.
Pawel Krakowiak

1
xn--stackoverflow.com'Stackoverflow' Punycode'dan dönüştürülemediğinden geçerli bir isim olmadığına dikkat edilmelidir . Ancak bu, bir normal ifadenin yapabileceğinin ötesinde. Genel bir açıklama olarak, xn--[a-z0-9]+etiketler yalnızca IDN olurken xn--[a-z0-9]+\-[a-z0-9]+, ASCII ve ASCII olmayan karakterlerin bir karışımını gösterir
Marcus

50

Sıradaki RegEx'im:

^[a-zA-Z0-9][a-zA-Z0-9-_]{0,61}[a-zA-Z0-9]{0,1}\.([a-zA-Z]{1,6}|[a-zA-Z0-9-]{1,30}\.[a-zA-Z]{2,3})$

onun için sorun yok i.oh1.me ve için wow.british-library.uk

UPD

İşte güncellenen kural

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Düzenli ifade görselleştirme

https://www.debuggex.com/r/y4Xe_hDVO11bv1DV

şimdi kontrol -veya _çalıştırma sırasında veya etki alanı etiketin sonunda.


9
Oldukça iyi görünüyor, ancak {2,6}yeni TLD için kriterlerin güncellenmesi gerekecek. Muhtemelen {2,}.
jwatts1980

@ jwatts1980 Bu tür bölgelerin bir örneği var mı? veya gelecekteki olası bölgeleri mi kastediyorsunuz?
paka

1
Yaklaşan değişiklikleri örneklerle ve ilgili kaynaklara bağlantılar ile tartışan bir makale: zdnet.com/…
jwatts1980

1
Neden ([a-zA-Z] {1} [a-zA-Z] {1}) ve değil ([a-zA-Z] {2})?
Anton

3
iki alternatifli son kısım da yanlış: IDNA alt etiketlerini kabul eden ccTLD'ler (iki harf) var. Ayrıca artık IDNA etiketlerini kullanan TLD etiketleri de mevcuttur. Diğerlerinden farklı olmayan son etiketi özel duruma getirmemelisiniz (ve şimdi değişken uzunluklarla eklenen birçok uzantı var, alt etki alanlarındaki diğer tüm etiketler gibi jsut. IDNA etiketlerinin de Punycoded görünebileceğini unutmayın (bu durumda "- olacaktır") - "etikette bir segment, etiketlerde" - "kullanımına izin verilen tek durum .. Son olarak, alt çizgi tüm etiketlerde her yerde geçersizdir.
verdy_p

24

Benim iddiam:

^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$

Açıklaması:

Alan adı segmentlerden oluşturulur. İşte bir bölüm (son hariç):

[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?

1-63 karakter içerebilir, '-' ile başlamaz veya bitmez.

Şimdi ekleyin. en az bir kez tekrarlayın:

(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+

Ardından, 2-63 karakter uzunluğundaki son bölümü ekleyin:

[a-z0-9][a-z0-9-]{0,61}[a-z0-9]

Burada test edin: http://regexr.com/3au3g


@GaneshBabu Tam eşleşmelerle neyi kastediyorsunuz?
Yaroslav Stavnichiy

1
Diğer tüm cevaplar benim için işe yaramadı ama bu işe yaradı.
Danny Coulombe

Sonunda noktalı virgül ve virgülden kaçınmak istediğimde benzer bir gereksinimim vardı, çok denedim ancak aşağıdaki Regex kullanıyorum const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-0-9 -] {0,61} [A-Za-0-9]) \) + [A-Za-0-9] [A-Za-0-9 -]?. { 0,61} [A-Za-0-9] / g; Peki kullanırsam doğrular ve; arada ama sonunda vliadate başarısız olur.
Harry

Geçerli olması gereken ancak normal ifadenizde geçersiz olan birkaç alan buldum. Örneğin редбулл.москва geçerli bir alan adı veya aynı zamanda редбулл.рф ve 红色 的 公牛. 中国
pubkey

1
@pubkey, bu alan adlarını punycode'a dönüştürmeniz gerekir . Редбулл.москва için gerçek isim xn - 90afc0aazy.xn - 80adxhks şeklindedir Ve benim normal ifadem buna uyuyor.
Yaroslav Stavnichiy

13

Sadece küçük bir düzeltme - son kısım 6'ya kadar olmalıdır.

^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,6}$

En uzun TLD museum(6 karakter) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains


3
Not: Bu, geçerli (ancak nadir) alan adı olan www.my---domain.com
Chris Bier

17
Yeni TLD ile kesmiyor, örneğin.photography
Sam Figueroa

2
@SamFigueroa Sadece uzunluğunu değiştirmeniz gerekecek
Steel Brain

3
TLD için bir kontrol olmamalıdır, alt alan adlarından farklı değildir. Ve normal availableifadeyi şu anda tld'lere dayandırmak geleceğin kanıtı değildir.
Loïc Faure-Lacroix


13

Kabul edilen cevap benim için çalışmıyor, şunu deneyin:

^ ((-?!) [A-Za-0-9 -] {1,63} (<? -!.) \) + [A-Za-z] {2,6} $

Doğrulama için bu Birim Testi Durumlarını ziyaret edin .


4
.audio, .photography ve bunların çoğu ... data.iana.org/TLD/tlds-alpha-by-domain.txt
mrbinky3000

@ mrbinky3000 Sonuncuyu {2,6}başka bir şeye değiştirin ve işe yarayacaktır. Benimki:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod

@Mygod regex'iniz son soru işaretinden sonra sıfır genişlikte çöp içeriyor, bu yüzden onu kopyalayanlar hoş olmayan bir şekilde şaşıracak
MightyPork

1
@MightyPork Haklısın! Üzgünüz, işte (umarım) temiz bir sürüm:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod

Çok hoş. Ne yazık ki, geriye doğru bakma ifadeleri JavaScript'te geçerli değildir. : /
PhiLho

13

Bu cevap, alan adları içindir (hizmet RR'leri dahil), ana bilgisayar adları için değil (bir e-posta ana bilgisayar adı gibi).

^(?=.{1,253}\.?$)(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}$

Temelde mkyong'un cevabı ve ek olarak:

  • Uzunluk önekleri ve boş kök dahil maksimum 255 sekizli uzunluk.
  • Sona izin ver "." açık dns kökü için.
  • Hizmet etki alanı RR'leri için önde gelen '_' öğelerine izin verin (hatalar: _ etiketleri için maksimum 15 karakter zorlamaz ve hizmet RR'lerinin üzerinde en az bir etki alanı gerektirmez)
  • Olası tüm TLD'lerle eşleşir.
  • Alt alan adı etiketlerini yakalamıyor.

Parçalara Göre

İleriye bakın, isteğe bağlı sondaki değişmez değer ile maksimum uzunluğu ^ $ ile 253 karakter arasında sınırlayın. '

(?=.{1,253}\.?$)

Bakın, sonraki karakter bir '-' değildir ve '_', bir sonraki '.' Karakterinden önceki herhangi bir karakteri takip etmez. Diğer bir deyişle, bir etiketin ilk karakterinin bir "-" olmadığını ve yalnızca ilk karakterin "_" olabileceğini zorlayın.

(?!-|[^.]+_)

Etiket başına izin verilen karakterlerin 1 ila 63'ü.

[A-Za-z0-9-_]{1,63}

Arkaya bak, önceki karakter '-' değil. Yani, bir etiketin son karakterinin '-' olmadığını zorla.

(?<!-)

Zorla a "." İsteğe bağlı olduğu sonuncusu hariç her etiketin sonunda.

(?:\.|$)

Çoğunlukla yukarıdan birleştirildiğinde, bu tam olarak doğru olmayan, ancak genellikle makul bir varsayım olan en az iki alan düzeyi gerektirir. TLD'lere veya uygun olmayan ilgili alt alan adlarına (ör. Localhost, myrouter, ila.) İzin vermek istiyorsanız {2,} 'den +' ya değiştirin

(?:(?!-|[^.]+_)[A-Za-z0-9-_]{1,63}(?<!-)(?:\.|$)){2,}

Bu ifade için birim testleri .


1
Teşekkürler! Bu, buradaki en iyi normal ifadedir. Kapsamlı açıklamanız ve birim testiniz bir bonus.
naudster

"RR" ne anlama geliyor?
Wheeler

Kaynak Kaydı. Genellikle size bir hizmetle nasıl etkileşim kuracağınızı söyleyen bir metin veya bilgi alanı.
Andrew Domaszek

Bu normal ifade doğru değil. Örneğin redbull. 移动 etki alanı geçerlidir ancak normal ifade eşleşmeyecektir.
pubkey

Önce zayıf koda dönüştürün, ardından eşleştirin. Ön punycode sürümündeki uzunluk sınırlarının uygulanması gerçekten zordur.
Andrew Domaszek

8

Diğer cevaplarda alan adı doğrulama çözümlerinde doğru yönü işaret ettiğiniz için teşekkür ederiz. Alan adları çeşitli şekillerde doğrulanabilir.

IDN etki alanını insan tarafından okunabilir biçimde doğrulamanız gerekirse , normal ifade \p{L}yardımcı olacaktır. Bu, herhangi bir dildeki herhangi bir karakteri eşleştirmeye izin verir.

Son bölümün de kısa çizgi içerebileceğini unutmayın ! Zayıf kodla kodlandığı için Çince isimler tld'de unicode karakterlere sahip olabilir.

Örneğin eşleşecek bir çözüme geldim:

  • google.com
  • masełkowski.pl
  • maselkowski.pl
  • m.maselkowski.pl
  • www.masełkowski.pl.com
  • xn--masekowski-d0b.pl
  • 中国 互联 网络 信息 中心. 中国
  • xn - fiqa61au8b7zsevnm8ak20mc4a87e.xn - fiqs8s

Normal ifade:

^[0-9\p{L}][0-9\p{L}-\.]{1,61}[0-9\p{L}]\.[0-9\p{L}][\p{L}-]*[0-9\p{L}]+$

Burayı kontrol edin ve ayarlayın

NOT: Bu regexp, mevcut alan adlarına izin verilen karakter kümesine olduğu gibi oldukça izin vericidir.

GÜNCELLEME : Daha basitleştirilmiş olarak a-aA-Z\p{L}sadece aynıdır\p{L}

NOT2: Tek sorun, alan adlarını çift noktalı olarak eşleştirmesidir ... gibi masełk..owski.pl. Bunu nasıl düzelteceğini bilen biri varsa lütfen iyileştirin.


Biz sadece kullanabilir [:alpha:]ve [:digit]yerine \p{L}. İyi çalışıyor.
puchu

Bir IDN'yi önce zayıf koda dönüştürmeden bu şekilde doğrulayamazsınız. Örneğin, ifadeniz 中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国geçerli olarak kontrol eder, ancak IDN dönüşümünden sonra etiket başına çok fazla bayttır. \ p {L}, sembollerle eşleşir, zayıf kod baytlarıyla (sembolden sembole değişir) eşleşmez, bu nedenle, dönüştürme sonrası boyutunu sınırlamaya çalışırken yineleme sayısı yardımcı olmaz.
Andrew Domaszek

İyi nokta, her bölüm 64 bayt ile sınırlıdır. Ancak bunu RegExp ile kontrol edemiyoruz, bu nedenle zayıf kod kod çözücüyü kullanarak daha ileri doğrulama adımları gereklidir - bu, örnek ana bilgisayar adınızla başarısız olur. Çinliler bu sınırlamaya deli olmalı.
PeterM

7
^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,7}$

[alan adı - yalnızca küçük harfler ve 0-9] [kısa çizgi olabilir] + [TLD - yalnızca küçük harf, 2 ve 7 harf uzunluğunda olmalıdır]
http://rubular.com/ normal ifadeleri test etmek için mükemmeldir!
Düzenleme: Dan Caddigan'ın belirttiği gibi '.rentals' için TLD maksimum 7 karakter olacak şekilde güncellendi.


1
TLD'leri neden sınırlandıralım? Şimdi .photographygeçersiz olur. Sadece sınırsız karakter veya bunun gibi bir şey yapın.
adriaan

5

Henüz yorum yapmak için yeterli temsilci yok. Paka'nın çözümüne yanıt olarak, üç öğeyi ayarlamam gerektiğini fark ettim:

  • Kısa çizgi ve alt çizgi, kısa çizgi bir aralık olarak yorumlandığı için taşındı ("0-9" da olduğu gibi)
  • Birçok alt alan adına sahip alan adları için tam nokta eklendi
  • TLD'lerin potansiyel uzunluğu 13'e çıkarıldı

Önce:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][a-zA-Z0-9-_]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,6}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

Sonra:

^(([a-zA-Z]{1})|([a-zA-Z]{1}[a-zA-Z]{1})|([a-zA-Z]{1}[0-9]{1})|([0-9]{1}[a-zA-Z]{1})|([a-zA-Z0-9][-_\.a-zA-Z0-9]{1,61}[a-zA-Z0-9]))\.([a-zA-Z]{2,13}|[a-zA-Z0-9-]{2,30}\.[a-zA-Z]{2,3})$

3

Yeni gTLD'ler için

/^((?!-)[\p{L}\p{N}-]+(?<!-)\.)+[\p{L}\p{N}]{2,}$/iu

2
Lütfen bize yanıt verdiğiniz şeyi diğerlerinden daha iyi hale getirecek daha fazla ayrıntı verin. Daha çok neyle eşleşiyorsunuz? Bilgileri eklemek için lütfen doğrudan yayınınızı düzenleyin.
Sven R.

Yazdığım gibi: yeni gTLD'ler. Unicode karakterlere ve ayrıca unicode TLD'lere sahip alanlar.
Ben Keil

1
@BenKeil: Bu bölüm ne hakkında: (? <! -)
jor

@jor bu olumsuz bir bakış. Şuna bak shortcutfoo.com/app/dojos/regex/cheatsheet
Muhammed Faizan

3

Daha önce belirtildiği gibi, alt .co.uketki alanlarını pratik anlamda (örneğin etki alanları) anlatmak açık değildir . Bu regex'i, wild'da oluşan etki alanlarını doğrulamak için kullanırız . Bildiğim tüm pratik kullanım durumlarını kapsar. Yenilerine açığız. Yönergelerimize göre, yakalamayan grupları ve açgözlü eşleşmeyi önler.

^(?!.*?_.*?)(?!(?:[\d\w]+?\.)?\-[\w\d\.\-]*?)(?![\w\d]+?\-\.(?:[\d\w\.\-]+?))(?=[\w\d])(?=[\w\d\.\-]*?\.+[\w\d\.\-]*?)(?![\w\d\.\-]{254})(?!(?:\.?[\w\d\-\.]*?[\w\d\-]{64,}\.)+?)[\w\d\.\-]+?(?<![\w\d\-\.]*?\.[\d]+?)(?<=[\w\d\-]{2,})(?<![\w\d\-]{25})$

Kanıt, açıklama ve örnekler: https://regex101.com/r/FLA9Bv/9 ( Not: şu anda yalnızca Chrome'da çalışmaktadır çünkü normal ifade, yalnızca ECMA2018'de desteklenen geriye doğru bakma özelliklerini kullanır )

Alan adlarını doğrularken seçilebilecek iki yaklaşım vardır.

Kitaplara göre FQDN eşleştirme (teorik tanım, pratikte nadiren karşılaşılır):

Pratik / muhafazakar FQDN eşleşmesi (pratik tanım, beklenen ve pratikte desteklenir):

  • aşağıdaki istisnalar / eklemelerle eşleşen kitaplara göre
  • geçerli karakterler: [a-zA-Z0-9.-]
  • etiketler kısa çizgilerle başlayamaz veya bitemez ( RFC-952 ve RFC-1123 / 2.1 uyarınca )
  • TLD minimum uzunluğu 2 karakter, maksimum uzunluk şu anda mevcut kayıtlara göre 24 karakterdir
  • sondaki noktayla eşleştirme


2

İşte örnekle birlikte eksiksiz kod:

<?php
function is_domain($url)
{
    $parse = parse_url($url);
    if (isset($parse['host'])) {
        $domain = $parse['host'];
    } else {
        $domain = $url;
    }

    return preg_match('/^(?!\-)(?:[a-zA-Z\d\-]{0,62}[a-zA-Z\d]\.){1,126}(?!\d+)[a-zA-Z\d]{1,63}$/', $domain);
}

echo is_domain('example.com'); //true
echo is_domain('https://example.com'); //true
echo is_domain('https://.example.com'); //false
echo is_domain('https://localhost'); //false

2
^((localhost)|((?!-)[A-Za-z0-9-]{1,63}(?<!-)\.)+[A-Za-z]{2,253})$

Cevabımın temeli için teşekkür ederim @ mkyong. Daha uzun kabul edilebilir etiketleri desteklemek için değiştirdim.

Ayrıca, "localhost" teknik olarak geçerli bir alan adıdır. Uluslararasılaştırılmış alan adlarını barındırmak için bu yanıtı değiştireceğim.


0
/^((([a-zA-Z]{1,2})|([0-9]{1,2})|([a-zA-Z0-9]{1,2})|([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]))\.)+[a-zA-Z]{2,6}$/
  • ([a-zA-Z]{1,2}) -> sadece iki karakter kabul etmek için.

  • ([0-9]{1,2})-> sadece iki sayıyı kabul etmek için

ikiyi aşan herhangi bir şey varsa, ([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])bu normal ifade bununla ilgilenecektir.

Eşleştirme yapmak istersek en az bir kez +kullanılacaktır.


0

^ [A-z-0-9] [- a-z-0-9]. (. [Az] {2,3}) + [a-z-0-9] [az] {2,3} ? (. [az] {2,3})? $

İşe yarayan örnekler:

stack.com
sta-ck.com
sta---ck.com
9sta--ck.com
sta--ck9.com
stack99.com
99stack.com
sta99ck.com

Ayrıca uzantılar için de çalışacak

.com.uk
.co.in
.uk.edu.in

İşe yaramayacak örnekler:

-stack.com

en uzun alan uzantısıyla bile çalışacaktır ".versicherung"



0

Aşağıdaki normal ifade, belirli bir alanın alt, kök ve tld'sini çıkarır:

^(?<domain>(?<domain_sub>(?:[^\/\"\]:\.\s\|\-][^\/\"\]:\.\s\|]*?\.)*?)(?<domain_root>[^\/\"\]:\s\.\|\n]+\.(?<domain_tld>(?:xn--)?[\w-]{2,7}(?:\.[a-zA-Z-]{2,3})*)))$

Aşağıdaki alanlar için test edildi:

* stack.com
* sta-ck.com
* sta---ck.com
* 9sta--ck.com
* sta--ck9.com
* stack99.com
* 99stack.com
* sta99ck.com
* google.com.uk
* google.co.in

* google.com
* masełkowski.pl
* maselkowski.pl
* m.maselkowski.pl
* www.masełkowski.pl.com
* xn--masekowski-d0b.pl
* xn--fiqa61au8b7zsevnm8ak20mc4a87e.xn--fiqs8s

* xn--stackoverflow.com
* stackoverflow.xn--com
* stackoverflow.co.uk

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.