2011-08-09 3 views
1

Un simple script de validation d'e-mail continue de m'échouer.Expression régulière PHP

if(!preg_match('^[^@]{1,63} @ [^@]{1,255}$', $input)) { 
    return false; 
} 

Il doit être simple, assurez-vous juste un symbole « @ », longueurs correctes pour l'adresse locale et le domaine. Mais les emails valides continuent à échouer à ce test. Dans le fichier error_log, je reçois également un message indiquant que '@' est une variable indéfinie. Suis-je supposé y échapper? Mettre des backslashes en face d'eux n'a pas aidé.

Merci d'avance.

* edit: Je suppose que je devrais préciser, il y a beaucoup plus de choses dans le script de validation d'email, je n'ai tout simplement pas posté car ces parties fonctionnent très bien. Ce n'est clairement pas la seule validation mais c'est la seule qui continue à me faire des erreurs.

+0

Pourquoi y at-il des espaces autour du '' @? – rockerest

+1

Cela retournerait aussi true pour '!" £ $%^& *() @! "£ $%^& *()'. Mauvais moments. – adlawson

+0

Les espaces sont juste pour le rendre facile pour les yeux. La vraie version est sans. Probablement ne devrait pas avoir ajouté cela cependant. – Renzo

Répondre

4

La validation d'un e-mail avec une simple regex est vouée à l'échec. Vérifiez cet article, qui passe par les longueurs de valider correctement une adresse e-mail avec PHP:

http://www.linuxjournal.com/article/9585?page=0,0

D'après les commentaires là-bas, vous pouvez également vérifier la fonction filter_var de PHP, qui semble simple & efficace (il est presque toujours préférable de ne pas réinventer la roue):

if(!filter_var($email, FILTER_VALIDATE_EMAIL)) 
{ 
exit("E-mail is not valid"); 
} 
+0

Oh je me rends compte. Ce n'est qu'une partie de la validation, je passe par beaucoup d'autres étapes, c'est juste que c'est la partie en question qui continue d'erreur et je ne peux pas comprendre pourquoi. – Renzo

+0

Je vois, néanmoins vérifier si filter_var fait l'affaire pour vous, après tout, il est construit en PHP et pourquoi reconstruire quelque chose qui est déjà là et fonctionne? Vous pourriez passer ce temps sur d'autres parties de votre projet :) –

+0

Vous vous rendez compte que PHP-interne FILTER_VALIDATE_EMAIL est en fait juste une regex? (ce n'est pas le meilleur) – mario

1

Vous ne devriez pas utiliser cette expression régulière pour valider une adresse électronique. Vraiment.

Quoi qu'il en soit, votre problème est avec la syntaxe preg_match, qui en tant que premier paramètre accepte un modèle au format / [...] /, où/sont PCRE delimiters.

donc votre appel serait:

if(!preg_match('/^[^@]{1,63}@[^@]{1,255}$/', $input)) { 

Mais s'il vous plaît, ne pas utiliser de cette façon.

0

S'il vous plaît garder à la mi que preg_match() et autres preg_*() fonctions ne sont pas fiables car ils retournent soit 0 ou false sur l'échec, donc un simple si ne jeter en cas d'erreur.

Pensez à utiliser CleanRegex:

if (pattern(('^[^@]{1,63}@[^@]{1,255}$')->matches($input)) 
{ 
    // Matches! :) 
}