Co to jest wyrażenie regularne, które dopasuje prawidłową nazwę domeny bez subdomeny?

123

Muszę zweryfikować nazwę domeny:

google.com

stackoverflow.com

A więc domena w najczystszej postaci - nawet nie subdomena, jak www.

  1. Znaki powinny być tylko az | AZ | 0-9 i kropka (.) I myślnik (-)
  2. Część nazwy domeny nie powinna zaczynać się ani kończyć myślnikiem (-) (np. -Google-.com)
  3. Część nazwy domeny powinna mieć od 1 do 63 znaków
  4. Rozszerzenie (TLD) może być na razie dowolne w ramach reguł nr 1, mogę je później zweryfikować na liście, jednak powinno to mieć 1 lub więcej znaków

Edycja: TLD ma najwyraźniej 2-6 znaków w obecnej postaci

Nie. 4 poprawiono: TLD powinno być właściwie oznaczone jako „subdomena”, ponieważ powinno zawierać takie rzeczy, jak .co.uk - wyobrażam sobie, że jedyna możliwa walidacja (poza sprawdzeniem na liście) to „po pierwszej kropce powinna znajdować się jedna lub więcej znaków zgodnie z zasadami nr 1

Bardzo dziękuję, uwierz mi, że próbowałem!

Dominic
źródło
1
Może wcale nie być pomocne. Jeśli chodzi o google.co.uk i niektóre domeny japońskie, jestem pewien, że będziesz musiał dwa razy pomyśleć, zanim użyjesz do tego wyrażenia regularnego. Osobiście uważam, że regex nie wystarczy, aby zweryfikować domenę w prawdziwej domenie. Do Twojej wiadomości, tutaj jest prawie pełna lista adresów TLD i lista domen drugiego poziomu z kodem kraju: static.ayesh.me/misc/SO/tlds.txt
Ayesh K
1
Zobacz moją odpowiedź na powiązane pytanie dotyczące weryfikacji nazwy hosta .
SAM,
2
Często zapominane: w przypadku w pełni kwalifikowanych nazw domen należy dopasować kropkę po tld.
schmijos
1
minęły
1
Niektóre z tych odpowiedzi są całkiem dobre, ale jest też inna dobra odpowiedź na inne pytanie, której warto się przyjrzeć.
craftworkgames

Odpowiedzi:

49

Cóż, jest to dość proste, trochę bardziej podstępne, niż wygląda (patrz komentarze), biorąc pod uwagę twoje specyficzne wymagania:

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

Pamiętaj jednak, że spowoduje to odrzucenie wielu prawidłowych domen.

Cameron
źródło
Miłe dzięki, ten wydaje się działać. Jakie domeny nie przejdą weryfikacji, wiesz?
Dominic
12
@infensus - Chociaż to wyrażenie regularne jest poprawne, biorąc pod uwagę Twoje specyfikacje, są one nieprawidłowe. g.cojest prawidłową nazwą domeny, ale gzawiera tylko jeden znak.
sch
3
To powinno pasować do wszystkich przypadków, które myślę: ^ ([a-z0-9 -] {1,61})? [A-z0-9] {1})? (\. [a-z0-9] (([a-z0-9 -] {1,61})? [a-z0-9] {1})?)? (\. [a-zA-Z] {2 , 4}) + $
transilvlad
1
x.com nie przejdzie tutaj
Neil McGuigan
4
@Neil: Masz rację. Pierwotne pytanie dotyczyło 3-63 znaków (patrz edycja 3). Może on zostać zmieniony w celu wspierania domen jeden-znakowe dość łatwo: /^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/. Ale to wciąż odrzuca mnóstwo ważnych rzeczy ...
Cameron
85

Wiem, że jest to trochę stary post, ale we wszystkich wyrażeniach regularnych brakuje jednego bardzo ważnego elementu: obsługi nazw domen IDN.

Nazwy domen IDN zaczynają się od xn--. Umożliwiają rozszerzenie znaków UTF-8 w nazwach domen. Na przykład, czy wiesz, że „♡ .com” jest prawidłową nazwą domeny? Tak, „love heart dot com”! Aby zweryfikować nazwę domeny, musisz pozwolić http://xn--c6h.com/ przejść weryfikację.

Uwaga, aby użyć tego wyrażenia regularnego, musisz przekonwertować domenę na małe litery, a także użyć biblioteki IDN, aby zapewnić kodowanie nazw domen do ACE (znanego również jako „Kodowanie zgodne z ASCII”). Jedną dobrą biblioteką jest GNU-Libidn.

idn (1) to interfejs wiersza poleceń do międzynarodowej biblioteki nazw domen. Poniższy przykład konwertuje nazwę hosta w UTF-8 na kodowanie ACE. Powstały adres URL https: //nic.xn--flw351e/ może być następnie użyty jako zakodowany w ACE odpowiednik https: // nic. 谷 歌 / .

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

To magiczne wyrażenie regularne powinno obejmować większość dziedzin (chociaż jestem pewien, że istnieje wiele ważnych przypadków skrajnych, które przegapiłem):

^((?!-))(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,})$

Wybierając wyrażenie regularne do weryfikacji domeny, powinieneś sprawdzić, czy domena jest zgodna z poniższym:

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

Jeśli te trzy domeny nie przejdą pomyślnie, Twoje wyrażenie regularne może nie zezwalać na legalne domeny!

Sprawdź The stronę internationalized domain name wsparcie od Oracle International Language Environment Przewodnik po więcej informacji.

Możesz wypróbować to wyrażenie regularne tutaj: http://www.regexr.com/3abjr

ICANN przechowuje listę delegowanych plików TLD, na której można zobaczyć kilka przykładów domen IDN.


Edytować:

 ^(((?!-))(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,})$

To wyrażenie regularne zatrzyma domeny ze znakiem „-” na końcu nazwy hosta jako oznaczone jako prawidłowe. Dodatkowo umożliwia nieograniczoną liczbę subdomen.

Tim Groeneveld
źródło
1
Zauważ, że będzie to obsługiwać maksymalnie jedną subdomenę, cokolwiek więcej niż to spowoduje fałsz. To nie jest coś, na co jesteś zniesławiony, chyba że używasz go do wewnętrznych witryn itp. Szybka próba umożliwienia mu obsługi większej liczby subdomen:/^((?!-))(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
stakolee
1
Ale lonely tld's nie działają :( Na przykład to.( to. ) To prawidłowy adres URL z zawartością.
iiic
@iiic, tak, ale to.nie jest to w pełni kwalifikowana nazwa domeny. Jeśli chcesz zezwolić na domeny najwyższego poziomu, powinieneś użyć czegoś w stylu ^(((?!-))(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,})\.?$, ale ostrzegaj, przepuścisz ludzi, którzy wstawiają domeny takie jak testlub nateż!
Tim Groeneveld,
Akceptuje invali.djako prawidłową nazwę domeny, gdy invali.d.co.ukjest nieprawidłowa.
Paweł Krakowiak
1
Należy zauważyć, że xn--stackoverflow.comnie jest to poprawna nazwa, ponieważ „stackoverflow” nie może zostać przekonwertowany z Punycode. To jednak wykracza poza to, co może zrobić wyrażenie regularne. Jako uwaga ogólna, xn--[a-z0-9]+etykiety byłyby tylko IDN, podczas gdy xn--[a-z0-9]+\-[a-z0-9]+wskazywałyby na mieszankę znaków ASCII i innych niż ASCII
Marcus,
50

Moje wyrażenie regularne jest następne:

^[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})$

jest ok dla i.oh1.me i dla wow.british-library.uk

UPD

Oto zaktualizowana reguła

^(([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})$

Wizualizacja wyrażeń regularnych

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

teraz sprawdza, -czy _na początku lub na końcu etykiety domeny.

paka
źródło
9
Wygląda całkiem nieźle, ale {2,6}kryteria będą musiały zostać zaktualizowane dla nowej domeny TLD. Prawdopodobnie {2,}.
jwatts1980
@ jwatts1980 czy są przykłady takich stref? czy masz na myśli możliwe przyszłe strefy?
paka
1
Oto artykuł omawiając nadchodzące zmiany za pomocą przykładów i linki do powiązanych zasobów: zdnet.com/...
jwatts1980
1
Dlaczego ([a-zA-Z] {1} [a-zA-Z] {1}), a nie ([a-zA-Z] {2})?
Anton
3
ostatnia część z dwiema alternatywami również jest błędna: istnieją ccTLD (dwie litery), które akceptują podetykiety IDNA. Istnieją również etykiety TLD, które już używają etykiet IDNA. Nie powinieneś specjalnie oznaczać ostatnią etykietą, która nie różni się od innych (i teraz ma wiele rozszerzeń dodanych o różnych długościach, ale tak jak wszystkie inne etykiety w subdomenach. Zauważ, że etykiety IDNA mogą również pojawiać się z kodowaniem Punycod (w takim przypadku będzie "- - „segment w etykiecie, jedyny przypadek, w którym„ - ”jest dozwolony w etykietach. Wreszcie podkreślenie jest nieprawidłowe we wszystkich etykietach.
verdy_p
24

Mój zakład:

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

Wyjaśnione:

Nazwa domeny jest zbudowana z segmentów. Oto jeden segment (oprócz wersji ostatecznej):

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

Może mieć od 1 do 63 znaków, nie zaczyna się ani nie kończy znakiem „-”.

Teraz dodaj „.” do niego i powtórz co najmniej jeden raz:

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

Następnie dołącz ostatni segment, który ma 2-63 znaków:

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

Przetestuj tutaj: http://regexr.com/3au3g

Yaroslav Stavnichiy
źródło
@GaneshBabu Co rozumiesz przez dokładne dopasowania?
Yaroslav Stavnichiy
1
Wszystkie inne odpowiedzi nie zadziałały dla mnie, ale ta zadziałała.
Danny
Miałem podobny wymóg, w którym chcę uniknąć średnika i przecinka na końcu. Wiele próbowałem, ale poniżej nie powiodło się to Regex, którego używam const regexDomain = / ^ (?: [A-Za-z0-9] (?: [A-Za-z0-9 -] {0,61} [A-Za-z0-9])? \.) + [A-Za-z0-9] [A-Za-z0-9 -] { 0,61} [A-Za-z0-9] / g; Cóż, sprawdza, czy używam i; pomiędzy, ale na końcu nie udaje się vliadate.
Harry,
Znalazłem kilka domen, które powinny być prawidłowe, ale zgodne z Twoim wyrażeniem regularnym są nieprawidłowe. Na przykład редбулл.москва jest prawidłową domeną lub również редбулл.рф i 红色 的 公牛. 中国
pubkey
1
@pubkey, musisz przekonwertować te nazwy domen na punycode . Rzeczywista nazwa dla редбулл.москва to xn - 90afc0aazy.xn - 80adxhks I moje wyrażenie regularne to pasuje.
Yaroslav Stavnichiy
13

Tylko drobna korekta - ostatnia część powinna mieć aż 6. Dlatego

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

Najdłuższa TLD to museum(6 znaków) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domains

ahadinyoto
źródło
3
Uwaga: to nie przejdzie prawidłowej (jeszcze rzadkiej) nazwy domeny www.my---domain.com
Chris Bier
17
Nie radzi sobie z nowym TLD, np..photography
Sam Figueroa
2
@SamFigueroa Będziesz musiał tylko zmienić jego długość
Steel Brain,
3
nie powinno być sprawdzania TLD, nie różni się od subdomen. availableOparcie wyrażenia regularnego na aktualnych tlds nie jest przyszłościowe.
Loïc Faure-Lacroix
1
Zaproponuj ostatni bit {2,63}: zobacz stackoverflow.com/questions/9238640/…
Eric Dobbs
13

Zaakceptowana odpowiedź nie działa dla mnie, spróbuj tego:

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

Odwiedź tę jednostkę przypadków testowych w celu weryfikacji.

mkyong
źródło
4
brak obsługi nowych, dłuższych nazw TLD, takich jak .audio, .photography i większość z nich ... data.iana.org/TLD/tlds-alpha-by-domain.txt
mrbinky3000
@ mrbinky3000 Po prostu zmień ostatnie {2,6}na coś innego i będzie działać. Mój:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod
@Mygod twoje wyrażenie regularne zawiera trochę śmieci o zerowej szerokości poza ostatnim znakiem zapytania, więc każdy, kto go
skopiuje,
1
@MightyPork Masz rację! Przepraszamy, oto (miejmy nadzieję) czystą wersję:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Mygod
Bardzo dobrze. Niestety, wyrażenia lookbehind nie są poprawne w JavaScript. : /
PhiLho
13

Ta odpowiedź dotyczy nazw domen (w tym usług RRs), a nie nazw hostów (takich jak nazwa hosta poczty e-mail).

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

Jest to w zasadzie odpowiedź mkyong i dodatkowo:

  • Maksymalna długość 255 oktetów, w tym prefiksy długości i zerowy pierwiastek.
  • Zezwalaj na końcowe „.” dla jawnego katalogu głównego dns.
  • Zezwalaj na początkowe „_” dla rekordów RR domeny usługi (błędy: nie wymusza maksymalnie 15 znaków dla etykiet _ ani nie wymaga co najmniej jednej domeny powyżej rekordów RR usługi)
  • Pasuje do wszystkich możliwych TLD.
  • Nie przechwytuje etykiet subdomen.

Według części

Lookahead, ogranicz maksymalną długość od ^ $ do 253 znaków z opcjonalnym końcowym literałem „.”

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

Lookahead, następny znak nie jest „-” i żaden „_” nie następuje po żadnym znaku przed następnym „.”. Oznacza to, że należy wymusić, aby pierwszy znak etykiety nie był „-” i tylko pierwszy znak mógł być „_”.

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

Od 1 do 63 dozwolonych znaków na etykietę.

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

Lookbehind, poprzedni znak nie „-”. Oznacza to, że wymuszaj, aby ostatni znak etykiety nie był „-”.

(?<!-)

Wymuś „.” na końcu każdej etykiety z wyjątkiem ostatniej, gdzie jest opcjonalna.

(?:\.|$)

Przeważnie w połączeniu z góry wymaga to co najmniej dwóch poziomów domeny, co nie jest do końca poprawne, ale zwykle jest rozsądnym założeniem. Zmień z {2,} na +, jeśli chcesz zezwolić na domeny TLD lub niekwalifikowane względne subdomeny (np. Localhost, myrouter, to).

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

Testy jednostkowe dla tego wyrażenia.

Andrzej Domaszek
źródło
1
Dzięki! To jest tutaj najlepsze wyrażenie regularne. Twoje dokładne wyjaśnienie i test jednostkowy to bonus.
naudster
Co oznacza „RR”?
Wheeler
Rekord zasobów. Zwykle jest to pole tekstowe lub informacyjne, które zawiera informacje na temat interakcji z usługą.
Andrzej Domaszek
To wyrażenie regularne jest nieprawidłowe. Na przykład domena redbull. 移动 jest prawidłowa, ale wyrażenie regularne nie będzie zgodne.
pubkey
Najpierw przekonwertuj na punycode, a następnie dopasuj. Ograniczenia długości w wersji sprzed kodu punycode są naprawdę trudne do zaimplementowania.
Andrzej Domaszek
8

Dziękujemy za wskazanie właściwego kierunku w rozwiązaniach dotyczących walidacji nazw domen w innych odpowiedziach. Nazwy domen można weryfikować na różne sposoby.

Jeśli potrzebujesz zweryfikować domenę IDN w jej czytelnej dla człowieka formie, \p{L}pomoże Ci regex . Pozwala to dopasować dowolną postać w dowolnym języku.

Zwróć uwagę, że ostatnia część może również zawierać łączniki ! Ponieważ chińskie nazwy zakodowane w punycode mogą zawierać znaki Unicode w tld.

Doszedłem do rozwiązania, które będzie pasowało np .:

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

Regex to:

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

Sprawdź i dostrój tutaj

UWAGA: To wyrażenie regularne jest dość liberalne, podobnie jak obecny zestaw znaków dozwolonych nazw domen.

AKTUALIZACJA : Jeszcze bardziej uproszczona, tak a-aA-Z\p{L}samo jak po prostu\p{L}

UWAGA2: Jedynym problemem jest to, że dopasuje domeny z podwójnymi kropkami ... na przykład masełk..owski.pl. Jeśli ktoś wie, jak to naprawić, popraw to.

PeterM
źródło
Możemy po prostu użyć [:alpha:]i [:digit]zamiast \p{L}. To działa dobrze.
puchu
Nie możesz zweryfikować IDN w ten sposób bez uprzedniej konwersji na punycode. Na przykład za pomocą wyrażenia 中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国sprawdza , czy jest poprawny, ale po konwersji IDN jest za dużo bajtów na etykietę. \ p {L} dopasowuje symbole, a nie bajty kodu punycode (które różnią się w zależności od symbolu), więc licznik powtórzeń nie jest pomocny przy próbie ograniczenia rozmiaru po konwersji.
Andrew Domaszek
Dobra uwaga, każda część jest ograniczona do 64 bajtów. Jednak nie możemy tego sprawdzić za pomocą RegExp, więc dalsze kroki weryfikacji są wymagane przy użyciu dekodera punycode - co zakończy się niepowodzeniem w przypadku przykładowej nazwy hosta. Chińczycy muszą być szaleni z powodu tego ograniczenia.
PeterM
7
^[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,7}$

[domena - tylko małe litery i 0-9] [może mieć łącznik] + [TLD - tylko małe litery, musi mieć długość od 2 do 7 liter]
http://rubular.com/ jest doskonały do ​​testowania wyrażeń regularnych!
Edycja: Zaktualizowano maksymalnie 7 znaków TLD dla „.rentals”, jak wskazał Dan Caddigan.

Chris
źródło
1
Po co ograniczać domeny TLD? Teraz .photographybyłoby nieważne. Po prostu ustaw nieograniczoną liczbę znaków lub coś w tym stylu.
adriaan
5

Za mało przedstawiciela, aby skomentować. W odpowiedzi na rozwiązanie paki stwierdziłem, że muszę dostosować trzy elementy:

  • Myślnik i podkreślenie zostały przeniesione, ponieważ myślnik jest interpretowany jako zakres (jak w „0-9”)
  • Dodano kropkę dla nazw domen z wieloma subdomenami
  • Wydłużono potencjalną długość TLD do 13

Przed:

^(([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})$

Po:

^(([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})$
zaTricky
źródło
3

Dla nowych domen gTLD

/^((?!-)[\p{L}\p{N}-]+(?<!-)\.)+[\p{L}\p{N}]{2,}$/iu
Ben Keil
źródło
2
Podaj nam więcej szczegółów, dzięki czemu Twoja odpowiedź jest lepsza od innych? Co bardziej pasujesz? Edytuj swój post bezpośrednio, aby dodać informacje.
Sven R.
Jak napisałem: nowe domeny gTLD. Domeny ze znakami Unicode, a także TLD Unicode.
Ben Keil,
1
@BenKeil: O czym jest ta część: (? <! -)
jor
@jor, czyli negatywne spojrzenie za siebie. Sprawdź to shortcutfoo.com/app/dojos/regex/cheatsheet
Muhammad Faizan
3

Jak już wspomniano, nie jest oczywiste, aby mówić o subdomenach w sensie praktycznym (np. .co.ukDomenach). Używamy tego wyrażenia regularnego do sprawdzania poprawności domen występujących w środowisku naturalnym. Obejmuje wszystkie praktyczne przypadki użycia, które znam. Nowe są mile widziane. Zgodnie z naszymi wytycznymi unika się grup nieprzechwytywanych i zachłannych dopasowań.

^(?!.*?_.*?)(?!(?:[\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})$

Dowód, wyjaśnienie i przykłady: https://regex101.com/r/FLA9Bv/9 ( Uwaga: obecnie działa tylko w Chrome, ponieważ wyrażenie regularne używa lookbehinds, które są obsługiwane tylko w ECMA2018 )

Podczas walidacji domen można wybrać jedną z dwóch metod.

Zgodne z podręcznikami dopasowanie FQDN (definicja teoretyczna, rzadko spotykana w praktyce):

Praktyczne / konserwatywne dopasowanie FQDN (definicja praktyczna, oczekiwana i wspierana w praktyce):

  • według książek dopasowanych z następującymi wyjątkami / dodatkami
  • prawidłowe znaki: [a-zA-Z0-9.-]
  • etykiety nie mogą zaczynać się ani kończyć łącznikami (zgodnie z RFC-952 i RFC-1123 / 2.1 )
  • Minimalna długość TLD to 2 znaki, maksymalna długość to 24 znaki, zgodnie z aktualnie istniejącymi rekordami
  • nie dopasowuj kropki końcowej
to mój projekt
źródło
2
^[a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9]\.[a-zA-Z]+(\.[a-zA-Z]+)$
nieznany użytkownik
źródło
5
-1 do dodania {2,4}. Możliwe jest posiadanie jednoznakowych TLD (jednak obecnie nie ma żadnych w katalogu głównym). A co z .mobile? .associates? Oba są prawidłowymi domenami TLD i zostałyby odrzucone przez to wyrażenie regularne. data.iana.org/TLD/tlds-alpha-by-domain.txt
Tim Groeneveld
2

Oto pełny kod z przykładem:

<?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
Maulik Gangani
źródło
2
^((localhost)|((?!-)[A-Za-z0-9-]{1,63}(?<!-)\.)+[A-Za-z]{2,253})$

Dziękuję @mkyong za podstawę mojej odpowiedzi. Zmodyfikowałem go, aby obsługiwał dłuższe dopuszczalne etykiety.

Ponadto „localhost” jest technicznie poprawną nazwą domeny. Zmodyfikuję tę odpowiedź, aby uwzględnić umiędzynarodowione nazwy domen.

Nate Watson
źródło
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}) -> za akceptację tylko dwóch znaków.

  • ([0-9]{1,2})-> za akceptowanie tylko dwóch liczb

jeśli cokolwiek przekracza więcej niż dwa, ([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])ten regeks zajmie się tym.

Jeśli chcemy zrobić dopasowanie, to przynajmniej raz użyjemy +.

priya
źródło
0

^ [a-zA-Z0-9] [- a-zA-Z0-9] + [a-zA-Z0-9]. [az] {2,3} (. [az] {2,3}) ? (. [az] {2,3})? $

Przykłady, które działają:

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

Będzie również działać w przypadku rozszerzeń

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

Przykłady, które nie zadziałają:

-stack.com

będzie działać nawet z najdłuższym rozszerzeniem domeny ".versicherung"

Khan podąża
źródło
0
  • ^((?!-))(xn--)?[a-z0-9][a-z0-9-_]{0,61}[a-z0-9]{0,}\.?((xn--)?([a-z0-9\-.]{1,61}|[a-z0-9-]{0,30})\.[a-z-1-9]{2,})$

zweryfikuje takie domeny jak яндекс.рфpo zakodowaniu.

https://regex101.com/r/Hf8wFM/1 - piaskownica

Danila Kulakov
źródło
0

Poniższe wyrażenie regularne wyodrębnia sub, root i tld z danej domeny:

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

Przetestowano dla następujących domen:

* 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
landen99
źródło