Muszę zweryfikować nazwę domeny:
google.com
stackoverflow.com
A więc domena w najczystszej postaci - nawet nie subdomena, jak www.
- Znaki powinny być tylko az | AZ | 0-9 i kropka (.) I myślnik (-)
- Część nazwy domeny nie powinna zaczynać się ani kończyć myślnikiem (-) (np. -Google-.com)
- Część nazwy domeny powinna mieć od 1 do 63 znaków
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!
regex
validation
domain-name
Dominic
źródło
źródło
Odpowiedzi:
Cóż, jest to
dość proste,trochę bardziej podstępne, niż wygląda (patrz komentarze), biorąc pod uwagę twoje specyficzne wymagania:Pamiętaj jednak, że spowoduje to odrzucenie wielu prawidłowych domen.
źródło
g.co
jest prawidłową nazwą domeny, aleg
zawiera tylko jeden znak./^[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 ...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. 谷 歌 / .
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):
Wybierając wyrażenie regularne do weryfikacji domeny, powinieneś sprawdzić, czy domena jest zgodna z poniższym:
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ć:
To wyrażenie regularne zatrzyma domeny ze znakiem „-” na końcu nazwy hosta jako oznaczone jako prawidłowe. Dodatkowo umożliwia nieograniczoną liczbę subdomen.
źródło
/^((?!-))(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
to.
( to. ) To prawidłowy adres URL z zawartością.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 jaktest
lubna
też!invali.d
jako prawidłową nazwę domeny, gdyinvali.d.co.uk
jest nieprawidłowa.xn--stackoverflow.com
nie 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 gdyxn--[a-z0-9]+\-[a-z0-9]+
wskazywałyby na mieszankę znaków ASCII i innych niż ASCIIMoje 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
https://www.debuggex.com/r/y4Xe_hDVO11bv1DV
teraz sprawdza,
-
czy_
na początku lub na końcu etykiety domeny.źródło
{2,6}
kryteria będą musiały zostać zaktualizowane dla nowej domeny TLD. Prawdopodobnie{2,}
.Mój zakład:
Wyjaśnione:
Nazwa domeny jest zbudowana z segmentów. Oto jeden segment (oprócz wersji ostatecznej):
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:
Następnie dołącz ostatni segment, który ma 2-63 znaków:
Przetestuj tutaj: http://regexr.com/3au3g
źródło
Tylko drobna korekta - ostatnia część powinna mieć aż 6. Dlatego
Najdłuższa TLD to
museum
(6 znaków) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domainsźródło
.photography
available
Oparcie wyrażenia regularnego na aktualnych tlds nie jest przyszłościowe.{2,63}
: zobacz stackoverflow.com/questions/9238640/…Zaakceptowana odpowiedź nie działa dla mnie, spróbuj tego:
Odwiedź tę jednostkę przypadków testowych w celu weryfikacji.
źródło
{2,6}
na coś innego i będzie działać. Mój:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Ta odpowiedź dotyczy nazw domen (w tym usług RRs), a nie nazw hostów (takich jak nazwa hosta poczty e-mail).
Jest to w zasadzie odpowiedź mkyong i dodatkowo:
Według części
Lookahead, ogranicz maksymalną długość od ^ $ do 253 znaków z opcjonalnym końcowym literałem „.”
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ę.
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).
Testy jednostkowe dla tego wyrażenia.
źródło
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 .:
Regex to:
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.źródło
[:alpha:]
i[:digit]
zamiast\p{L}
. To działa dobrze.中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国
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.[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.
źródło
.photography
byłoby nieważne. Po prostu ustaw nieograniczoną liczbę znaków lub coś w tym stylu.Za mało przedstawiciela, aby skomentować. W odpowiedzi na rozwiązanie paki stwierdziłem, że muszę dostosować trzy elementy:
Przed:
Po:
źródło
Dla nowych domen gTLD
źródło
Jak już wspomniano, nie jest oczywiste, aby mówić o subdomenach w sensie praktycznym (np.
.co.uk
Domenach). 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):
[a-zA-Z0-9.-]
źródło
źródło
Oto pełny kod z przykładem:
źródło
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.
źródło
([a-zA-Z]{1,2})
-> za akceptację tylko dwóch znaków.([0-9]{1,2})
-> za akceptowanie tylko dwóch liczbjeś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
+
.źródło
Przykłady, które działają:
Będzie również działać w przypadku rozszerzeń
Przykłady, które nie zadziałają:
będzie działać nawet z najdłuższym rozszerzeniem domeny
".versicherung"
źródło
^((?!-))(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
źródło
Poniższe wyrażenie regularne wyodrębnia sub, root i tld z danej domeny:
Przetestowano dla następujących domen:
źródło
Zrobiłem poniżej, aby po prostu pobrać domenę wraz z protokołem. Przykład: https://www.facebook.com/profile/user/ ftp://182.282.34.337/movies/M
użyj poniższego wzorca Regex: [a-zA-Z0-9] +: //.*? /
otrzymasz wynik: https://www.facebook.com/ ftp://192.282.34.337/
źródło