2010-05-24 23 views
9

J'utilise python et je voudrais une simple api ou regex pour vérifier la validité d'un nom de domaine. Par validité, je suis la validité syntaxique et non si le nom de domaine existe réellement sur Internet ou non.Rechercher un nom de domaine valide dans une chaîne?

+0

Pour quelle raison? S'il s'agit d'un e-mail, la validité réelle doit être vérifiée en faisant une requête DNS pour l'enregistrement MX, et non pas par regexp. – Kimvais

+5

Non. Il n'y a aucun avantage à faire des recherches pour les noms invalides connus, c'est juste une perte de temps et de ressources. De plus, vous n'avez pas besoin d'un enregistrement MX pour envoyer des e-mails, un enregistrement A est suffisant. – Synchro

+0

Semble qu'il est déjà discuté [ICI] (http://stackoverflow.com/questions/1128168/validation-for-url-domain-using-regex-rails). – Incognito

Répondre

13

Tout nom de domaine est (syntaxiquement) valide s'il s'agit d'une liste d'identificateurs séparés par des points, chacun ne comportant pas plus de 63 caractères et composée de lettres, de chiffres et de tirets (pas de traits de soulignement).

Alors:

r'[a-zA-Z\d-]{,63}(\.[a-zA-Z\d-]{,63})*' 

serait un début. Bien sûr, ces jours-ci, certains caractères non-Ascii peuvent être autorisés (un développement très récent) qui change beaucoup les paramètres - avez-vous besoin de faire face à cela?

+0

un identifiant peut-il commencer/se terminer par un trait d'union? – Amarghosh

+0

Merci! Non, je n'ai pas besoin d'un contrôle de base pour s'assurer qu'il ne contient pas de caractères sur la liste noire tels que '! "etc – demos

+0

Alex, je sais que vous êtes un gourou appengine, s'il vous plaît aidez-moi avec celui-ci: http: // stackoverflow.com/questions/2894808/create-auto-incrementing-colonne-dans-google-appengine Merci d'avance! – demos

5
r'^(?=.{4,255}$)([a-zA-Z0-9][a-zA-Z0-9-]{,61}[a-zA-Z0-9]\.)+[a-zA-Z0-9]{2,5}$' 
  • Lookahead fait en sorte qu 'il présente un minimum de quatre (a.in) et un maximum de 255 caractères
  • une ou plusieurs étiquettes (séparés par des périodes) de longueur comprise entre 1 et 63, en commençant et se terminant avec des caractères alphanumériques et contenant des caractères alphanumériques et des tirets au milieu.
  • suivi d'un nom de domaine de niveau supérieur (dont la longueur maximale est de 5 pour le musée)
+1

Ceci ne peut pas stocker punycode. Le plus court nom de domaine de deux lettres en cyrillique est de 6 lettres en punycode. – kaleissin

+2

museum est 6 caractères, pas 5. –

+0

C'est une mauvaise idée de coder en dur la longueur attendue de TLD, particulièrement maintenant que les TLD IDN sortent qui sont encodés et sortent donc beaucoup plus longtemps que 5. –

1

de noter que pendant que vous pouvez faire quelque chose avec des expressions régulières, le tester pour les noms de domaine valides façon plus fiable est d'essayer réellement de résoudre le nom (avec socket.getaddrinfo):

from socket import getaddrinfo 

result = getaddrinfo("www.google.com", None) 
print result[0][4] 

Notez que techniquement cela peut vous laisser ouvert à DoS (si quelqu'un soumet des milliers de noms de domaine non valides, il peut prendre un certain temps pour résoudre nam invalide es), mais vous pourriez simplement limiter le tarif de quelqu'un qui essaie cela. L'avantage de ceci est qu'il va attraper "hotmail.con" comme invalide (au lieu de "hotmail.com", disons) alors qu'une regex dirait "hotmail.con" est valide.

+2

Ceci est vraiment un problème distinct et pas une bonne réponse à la question. Étant donné que le DNS a été utilisé pour des exploits dans le passé, vérifier qu'une chaîne est au moins vaguement valide avant de l'utiliser est seulement judicieux, et c'est des ordres de grandeur plus rapides qu'une recherche DNS. C'est comme exécuter du code pour voir si c'est malveillant! – Synchro

+0

Ceci ne peut pas être utilisé pour valider les noms de domaine qui sont sur le point d'être créés, seulement pour ceux qui existent déjà. – nerdoc

+0

Pourquoi une URL valide comme: 'https: // google.com /' renvoie une erreur? –

0

J'utilise ceci:

(r'(\.|\/)(([A-Za-z\d]+|[A-Za-z\d][-])+[A-Za-z\d]+){1,63}\.([A-Za-z]{2,3}\.[A-Za-z]{2}|[A-Za-z]{2,6})') 

pour vous assurer qu'il suit soit après le point (www.) Et/ou (http: //) et le tableau de bord se produit uniquement à l'intérieur du nom et de faire correspondre ces suffixes comme gov.uk aussi.

0

Les réponses sont toutes assez obsolètes avec la spécification à ce stade. Je crois que le ci-dessous correspondra correctement à la spécification actuelle:

r'^(?=.{1,253}$)(?!.*\.\..*)(?!\..*)([a-zA-Z0-9-]{,63}\.){,127}[a-zA-Z0-9-]{1,63}$'