2011-07-01 1 views
1

S'il vous plaît ne pas downvote la question en raison du fait que la réponse que je cherche n'est pas une personne que quelqu'un devrait poursuivre. Je suis pleinement conscient de cela, mais ce n'est pas mon idée, je viens de livrer: DBloquer certains fournisseurs de messagerie en utilisant Regex

Dans CakePHP, je le dataentry suivant dans mon modèle:

'email' => array(
     'email' => array(
      'rule' => array('email',false,'(^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$)') 
     ), 
    ) 

La règle de courrier électronique est une commune fonction dans la validation de données cakephp, et les deuxième et troisième paramètres sont facultatifs. Le troisième étant l'expression rationnelle. Je n'étais pas content de la chaîne regex donnée, alors j'ai ajouté la mienne. Maintenant, je veux exclure les adresses Gmail, Hotmail et Yahoo.

Comment est-ce que je peux changer l'expression régulière ainsi ces adresses produisent faux comme résultat? Je ne peux pas le faire correctement.

+0

Pourquoi voulez-vous emmerder les utilisateurs? – ThiefMaster

+1

Eh bien bonne question: je ne sais pas et ça me brise le coeur. C'est juste que le gars qui veut cette chose pense qu'il filtre les gens qui veulent juste jeter un oeil à son outil tout en ne laissant pas un véritable email pour s'identifier. –

+2

Juste un indice: je suis sûr que vous pouvez avoir une adresse e-mail beaucoup plus intéressante que celle de votre regex. – Piskvor

Répondre

5

Pourquoi diable voudriez-vous exclure les adresses gmail, hotmail et yahoo? Il y a beaucoup de gens qui n'ont qu'une de ces adresses et aucune autre. C'est une mauvaise idée. Si vous ciblez un "public" spécifique, je suggère de faire une liste de domaines autorisés à la place.

Quoi qu'il en soit, voici une regex fonctionnelle pour vous qui est plus courte que celle que vous avez déjà .. essayer:

\b[\w\.-][email protected]((?!gmail|googlemail|yahoo|hotmail).)[\w\.-]+\.\w{2,4}\b 
+0

Entièrement d'accord, mais le client le veut de cette façon :) Donc, je veux juste savoir si c'est possible. Mes expressions régulières atteignent seulement jusqu'ici ... –

+0

Ma dernière édition devrait faire l'affaire .. (Je me sens si sale ..: D) – tskulbru

+0

Cela a fait le Trick Serrghi ... Merci! Je suis terriblement désolé de vous avoir traîné à travers l'enfer pour obtenir ma réponse: D –

2

N'utilisez pas une regex pour cela.

La bonne solution est de explode() l'adresse e-mail au signe @, puis d'utiliser des comparaisons de chaînes de caractères ou même in_array() pour vérifier si le domaine est sur la liste noire.

+0

Mais est-ce possible? Je ne l'aurais jamais fait de cette façon, mais je veux utiliser les outils donnés par cakephp, sans ajouter mes propres fonctions. De cette façon, je peux garder mon modèle propre. –

+0

[explode est une fonction intégrée en PHP] (http://php.net/manual/fr/function.explode.php), donc ça devrait fonctionner dans n'importe quel framework PHP, j'espère. – ewall

Questions connexes