J'ai besoin de valider un nom de domaine:
google.com
stackoverflow.com
Donc, un domaine dans sa forme la plus brute - pas même un sous-domaine comme www.
- Les caractères ne doivent être que az | AZ | 0-9 et point (.) Et tiret (-)
- La partie du nom de domaine ne doit pas commencer ou se terminer par un tiret (-) (par exemple -google-.com)
- La partie du nom de domaine doit comporter entre 1 et 63 caractères
L'extension (TLD) peut être n'importe quoi sous les règles n ° 1 pour le moment, je peux les valider par rapport à une liste plus tard, cela devrait contenir 1 ou plusieurs caractères
Edit: TLD est apparemment 2-6 caractères tel qu'il est
non. 4 révisé: le TLD devrait en fait être étiqueté "sous-domaine" car il devrait inclure des éléments comme .co.uk - j'imagine que la seule validation possible (à part la vérification par rapport à une liste) serait 'après le premier point, il devrait y en avoir un ou plus de personnages selon les règles n ° 1
Merci beaucoup, croyez-moi, j'ai essayé!
regex
validation
domain-name
Dominique
la source
la source
Réponses:
Eh bien, c'est
assez simpleun peu plus sournois qu'il n'y paraît (voir les commentaires), compte tenu de vos besoins spécifiques:Mais notez que cela rejettera un grand nombre de domaines valides.
la source
g.co
est un nom de domaine valide maisg
ne comporte qu'un seul caractère./^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?\.[a-zA-Z]{2,}$/
. Mais cela rejette toujours des tonnes de trucs valides ...Je sais que c'est un peu un vieux post, mais il manque à toutes les expressions régulières ici un élément très important: le support des noms de domaine IDN.
Les noms de domaine IDN commencent par xn--. Ils activent les caractères UTF-8 étendus dans les noms de domaine. Par exemple, saviez-vous que «♡ .com» est un nom de domaine valide? Ouais, "love heart dot com"! Pour valider le nom de domaine, vous devez laisser http://xn--c6h.com/ passer la validation.
Notez que pour utiliser cette expression régulière, vous devrez convertir le domaine en minuscules et également utiliser une bibliothèque IDN pour vous assurer d'encoder les noms de domaine en ACE (également connu sous le nom de «codage compatible ASCII»). Une bonne bibliothèque est GNU-Libidn.
idn (1) est l'interface de ligne de commande vers la bibliothèque de noms de domaine internationalisée. L'exemple suivant convertit le nom d'hôte en UTF-8 en encodage ACE. L'URL résultante https: //nic.xn--flw351e/ peut ensuite être utilisée comme équivalent codé ACE de https: // nic. 谷 歌 / .
Cette expression régulière magique devrait couvrir la plupart des domaines (même si je suis sûr qu'il existe de nombreux cas limites valides que j'ai manqués):
Lorsque vous choisissez une expression régulière de validation de domaine, vous devriez voir si le domaine correspond à ce qui suit:
Si ces trois domaines ne passent pas, votre expression régulière n'autorise peut-être pas les domaines légitimes!
Consultez la page de prise en charge des noms de domaine internationalisés du guide Oracle's International Language Environment Guide pour plus d'informations.
N'hésitez pas à essayer la regex ici: http://www.regexr.com/3abjr
L'ICANN conserve une liste des noms de domaine qui ont été délégués et qui peut être utilisée pour voir quelques exemples de domaines IDN.
Éditer:
Cette expression régulière arrêtera les domaines qui ont «-» à la fin d'un nom d'hôte comme étant marqués comme valides. De plus, il autorise un nombre illimité de sous-domaines.
la source
/^((?!-))(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. ) Est une URL valide avec le contenu.to.
n'est pas un nom de domaine complet. Si vous souhaitez autoriser les domaines de premier niveau, vous devez utiliser quelque chose comme^(((?!-))(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,})\.?$
, mais soyez averti, vous laisserez passer les personnes qui mettent des domaines commetest
ouna
, aussi!invali.d
comme nom de domaine valide tant qu'ilinvali.d.co.uk
n'est pas valide.xn--stackoverflow.com
n'est pas un nom valide car 'stackoverflow' ne peut pas être converti à partir de Punycode. C'est cependant au-delà de ce qu'une regex peut faire. Comme remarque générale, lesxn--[a-z0-9]+
étiquettes seraient uniquement IDN alorsxn--[a-z0-9]+\-[a-z0-9]+
qu'elles indiqueraient un mélange de caractères ASCII et non ASCIIMon RegEx est le suivant:
^[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})$
c'est bon pour i.oh1.me et pour wow.british-library.uk
UPD
Voici la règle mise à jour
https://www.debuggex.com/r/y4Xe_hDVO11bv1DV
maintenant, il vérifie
-
ou_
au début ou à la fin de l'étiquette de domaine.la source
{2,6}
critères devront être mis à jour pour le nouveau TLD. Probablement{2,}
.Mon pari:
Expliqué:
Le nom de domaine est construit à partir de segments. Voici un segment (sauf final):
Il peut contenir de 1 à 63 caractères, ne commence ni ne se termine par «-».
Maintenant, ajoutez "." et répétez au moins une fois:
Ensuite, attachez le dernier segment, qui comprend 2 à 63 caractères:
Testez-le ici: http://regexr.com/3au3g
la source
Juste une correction mineure - la dernière partie devrait être jusqu'à 6. Par conséquent,
Le TLD le plus long est
museum
(6 caractères) - http://en.wikipedia.org/wiki/List_of_Internet_top-level_domainsla source
.photography
available
tld actuels n'est pas une preuve pour l'avenir.{2,63}
: voir stackoverflow.com/questions/9238640/...La réponse acceptée ne fonctionne pas pour moi, essayez ceci:
Visitez ce cas de test unitaire pour validation.
la source
{2,6}
en quelque chose d'autre et cela fonctionnera. Mine:^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
^((?!-)[a-zA-Z0-9-]{1,63}(?<!-)\.)+(?!-)[a-zA-Z0-9-]{1,63}(?<!-)$
Cette réponse concerne les noms de domaine (y compris les RR de service), pas les noms d'hôte (comme un nom d'hôte de messagerie).
C'est essentiellement la réponse de mkyong et en plus:
Par pièces
Lookahead, limite la longueur maximale entre ^ $ et 253 caractères avec le littéral de fin facultatif '.'
Lookahead, le caractère suivant n'est pas un «-» et aucun «_» ne suit les caractères avant le suivant «.». C'est-à-dire que le premier caractère d'une étiquette n'est pas un «-» et que seul le premier caractère peut être un «_».
Entre 1 et 63 des caractères autorisés par étiquette.
Regarde derrière, caractère précédent pas «-». C'est-à-dire, assurez-vous que le dernier caractère d'une étiquette n'est pas un «-».
Forcer un "." à la fin de chaque étiquette sauf la dernière, où elle est facultative.
La plupart du temps combiné par le haut, cela nécessite au moins deux niveaux de domaine, ce qui n'est pas tout à fait correct, mais généralement une hypothèse raisonnable. Passez de {2,} à + si vous souhaitez autoriser les TLD ou les sous-domaines relatifs non qualifiés via (par exemple, localhost, myrouter, to.)
Tests unitaires pour cette expression.
la source
Merci d'avoir indiqué la bonne direction dans les solutions de validation de nom de domaine dans d'autres réponses. Les noms de domaine peuvent être validés de différentes manières.
Si vous devez valider le domaine IDN dans sa forme lisible par l'homme , regex
\p{L}
aidera. Cela permet de faire correspondre n'importe quel caractère dans n'importe quelle langue.Notez que la dernière partie peut contenir des traits d'union ! En tant que punycode, les noms chinois peuvent avoir des caractères unicode dans tld.
Je suis venu à une solution qui correspondra par exemple:
Regex est:
Vérifiez et réglez ici
REMARQUE: Cette expression rationnelle est assez permissive, tout comme le jeu de caractères actuellement autorisé pour les noms de domaine.
MISE À JOUR : Encore plus simplifié, comme
a-aA-Z\p{L}
c'est juste\p{L}
NOTE2: Le seul problème est qu'il correspondra aux domaines avec des points doubles ..., comme
masełk..owski.pl
. Si quelqu'un sait comment résoudre ce problème, veuillez améliorer.la source
[:alpha:]
et[:digit]
au lieu de\p{L}
. Ça fonctionne bien.中国互联网络信息中心中国互联网络信息中心中国互联网络信.中国
vérifie comme valide, mais après la conversion IDN, il y a trop d'octets par étiquette. \ p {L} correspond à des symboles, pas à des octets de punycode (qui varient d'un symbole à l'autre), donc le nombre de répétitions est inutile lorsque vous essayez de limiter sa taille post-conversion.[domaine - lettres minuscules et 0-9 uniquement] [peut avoir un trait d'union] + [TLD - minuscules uniquement, doit être compris entre 2 et 7 lettres]
http://rubular.com/ est génial pour tester les expressions régulières!
Edit: mise à jour du TLD maximum à 7 caractères pour «.rentals» comme l'a souligné Dan Caddigan.
la source
.photography
serait invalide. Faites-en un nombre illimité de caractères ou quelque chose comme ça.Pas encore assez de représentants pour commenter. En réponse à la solution de paka, j'ai trouvé que je devais ajuster trois éléments:
Avant:
Après:
la source
Pour les nouveaux gTLD
la source
Comme déjà souligné, il n'est pas évident de dire les sous-domaines au sens pratique (par exemple les
.co.uk
domaines). Nous utilisons cette expression régulière pour valider les domaines qui se produisent dans la nature. Il couvre tous les cas d'utilisation pratiques que je connais. Les nouveaux sont les bienvenus. Selon nos directives, il évite les groupes non capturants et les correspondances gourmandes.^(?!.*?_.*?)(?!(?:[\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})$
Preuve, explication et exemples: https://regex101.com/r/FLA9Bv/9 ( Remarque: ne fonctionne actuellement que dans Chrome car l'expression régulière utilise des lookbehinds qui ne sont pris en charge que dans ECMA2018 )
Vous avez le choix entre deux approches lors de la validation des domaines.
Correspondance FQDN par les livres (définition théorique, rarement rencontrée en pratique):
Correspondance FQDN pratique / conservatrice (définition pratique, attendue et prise en charge dans la pratique):
[a-zA-Z0-9.-]
la source
la source
Voici le code complet avec exemple:
la source
Merci @mkyong pour la base de ma réponse. Je l'ai modifié pour prendre en charge des étiquettes acceptables plus longues.
De plus, "localhost" est techniquement un nom de domaine valide. Je modifierai cette réponse pour accueillir les noms de domaine internationalisés.
la source
([a-zA-Z]{1,2})
-> pour n'accepter que deux caractères.([0-9]{1,2})
-> pour n'accepter que deux numérossi quelque chose dépasse au-delà de deux
([a-zA-Z0-9][a-zA-Z0-9-]{1,61}[a-zA-Z0-9])
cette regex s'en chargera.Si nous voulons faire l'appariement pendant au moins une fois
+
sera utilisé.la source
Exemples qui fonctionnent:
Cela fonctionnera également pour les extensions
Exemples qui ne fonctionneront pas:
cela fonctionnera même avec la plus longue extension de domaine
".versicherung"
la source
^((?!-))(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,})$
validera ces domaines comme
яндекс.рф
après le codage.https://regex101.com/r/Hf8wFM/1 - bac à sable
la source
L'expression régulière suivante extrait le sous, la racine et le tld d'un domaine donné:
Testé pour les domaines suivants:
la source
J'ai fait ce qui suit pour récupérer simplement le domaine avec le protocole. Exemple: https://www.facebook.com/profile/user/ ftp://182.282.34.337/movies/M
utilisez le modèle Regex ci-dessous: [a-zA-Z0-9] +: //.*? /
vous obtiendrez la sortie: https://www.facebook.com/ ftp://192.282.34.337/
la source