13 votes

Pourquoi les gens utilisent-ils les regexp pour les emails et autres validations complexes ?

Il existe un certain nombre de e-mail regexp questions popping en haut ici, et je suis honnêtement déconcerté par la raison pour laquelle les gens utilisent ces follement obtus plutôt qu'un analyseur syntaxique très simple qui divise l'e-mail en deux parties, le nom et le domaine, puis les valide en fonction des caractères valides autorisés pour le nom (aucune autre vérification ne peut être effectuée sur cette partie) et des caractères valides pour le domaine (et je suppose que vous pourriez ajouter une vérification pour tous les TLD du monde, puis un autre niveau de domaines de second niveau pour les pays qui en ont (par exemple, com.uk)).

Le vrai problème est que les tlds et slds ne cessent de changer (contrairement à ce que l'on croit généralement), et qu'il faut donc mettre à jour la regexp si l'on veut effectuer toutes ces vérifications de haut niveau à chaque fois que les serveurs de noms racine envoient un changement.

Pourquoi ne pas avoir un module qui valide simplement les domaines, qui tire d'une base de données, ou d'un fichier plat, et qui vérifie optionnellement les enregistrements DNS correspondants ?

Je suis sérieux, pourquoi tout le monde tient-il tant à inventer la regexp parfaite pour cela ? Cela ne semble pas être une solution appropriée au problème...

Convainquez-moi que non seulement il est possible de le faire en regexp (et de satisfaire tout le monde) mais que c'est une meilleure solution qu'un analyseur/validateur personnalisé.

-Adam

25voto

Dave Sherohman Points 25122

Ils le font parce qu'ils voient "Je veux tester si ce texte correspond à la spécification" et pensent immédiatement "Je sais, je vais utiliser une regex !" sans comprendre pleinement la complexité de la spécification ou les limites des regex. Les regex sont un outil merveilleux et puissant pour gérer une grande variété de tâches de correspondance de texte, mais elles ne sont pas l'outil parfait pour toutes ces tâches et il semble que de nombreuses personnes qui les utilisent perdent de vue ce fait.

8voto

Brian Knoblauch Points 8747

Les expressions rationnelles qui permettent de détecter la plupart des erreurs courantes (mais pas toutes) sont relativement faciles à configurer et à déployer. L'écriture d'un analyseur personnalisé prend plus de temps.

8voto

Konrad Rudolph Points 231505

La tentation d'utiliser RegExp, une fois que vous avez maîtrisé les bases, est très grande. En fait, RegExp semble si puissant que les gens veulent naturellement commencer à l'utiliser partout. Je soupçonne vraiment qu'il y a beaucoup de psychologie impliquée ici, comme démontré par Randall's Bande dessinée XKCD (et oui, il est utile).

J'ai fait une fois une présentation d'introduction à RegExp et la diapositive la plus importante mettait en garde contre sa surutilisation. C'était la seule diapositive qui utilisait en gras la police. Je pense que cela devrait être fait plus souvent.

Everybody stand back!

4voto

Chris Vest Points 5622

L'utilisation d'expressions régulières pour cela est pas une bonne idée, comme cela a été longuement démontré dans ces autres posts.

Je suppose que les gens continuent à le faire parce qu'ils ne connaissent pas mieux ou qu'ils s'en fichent.

Un analyseur syntaxique sera-t-il meilleur ? Peut-être, peut-être pas.

Je maintiens que l'envoi d'un e-mail de vérification est le meilleur moyen de le valider. Si vous voulez vérifier quelque chose à partir de JavaScript, vérifiez qu'il y a un signe '@' et quelque chose avant et après. Si vous êtes plus strict que cela, vous risquez de vous heurter à une syntaxe que vous ne connaissiez pas et votre validateur deviendra trop restrictif.

Aussi, faites attention avec votre système de validation des TLD, vous pourriez découvrir que vous êtes en supposant trop sur ce qui est autorisé dans un TLD.

3voto

Ben Doom Points 6581

et les valide ensuite par rapport à la caractères valides autorisés pour le nom (il n'y a pas de vérification supplémentaire qui peut être sur cette partie)

Ce n'est pas vrai. Par exemple, "ben..doom@gmail.com" ne contient que des caractères valides dans la section du nom, mais n'est pas valide.

Dans les langues qui ne disposent pas de bibliothèques pour la validation des e-mails, j'utilise généralement les expressions rationnelles car

  1. Je connais les expressions rationnelles et je les trouve faciles à utiliser.
  2. J'ai beaucoup d'amis qui connaissent les regex, et je peux collaborer avec
  3. Je peux coder rapidement, et mon temps est plus coûteux que le temps processeur pour la plupart des applications.
  4. Pour la majorité des adresses électroniques, cela fonctionne.

Je suis sûr que de nombreuses bibliothèques intégrées utilisent votre approche, et si vous voulez couvrir toutes les possibilités, cela devient ridicule. Cependant, votre analyseur le devient aussi. La spécification formelle des adresses électroniques est absurdement complexe. Donc, nous utilisons une regex qui s'en rapproche suffisamment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X