2009-11-30 4 views
0

J'essaie de créer un script qui n'exécutera ses actions que si l'adresse e-mail que l'utilisateur saisit provient d'un domaine spécifique. J'ai créé une regex qui semble fonctionner quand on la teste via l'utilitaire regex, mais lorsqu'elle est utilisée dans mon script PHP, elle me dit que les emails valides ne sont pas valides. Dans ce cas, je veux que tout e-mail provenant de @ secondgearsoftware.com, @ secondgearllc.com ou asia.secondgearsoftware.com fasse écho au succès et que tous les autres soient rejetés.N'exécuter un script que si un email spécifique provient d'un domaine spécifique

$pattern = '/\b[A-Z0-9\._%+-][email protected]((secondgearsoftware|secondgearllc|euro\.secondgearsoftware|asia\.secondgearsoftware)+\.)+com/'; 
$email = urldecode($_POST['email']); 
if (preg_match($pattern, $email)) 
{ 
    echo 'success'; 
} 
else 
{ 
    echo 'opposite success'; 
} 

Je ne suis pas vraiment sûr de ce qui est futzed avec le modèle. Toute aide serait appréciée.

Répondre

-1

Je vous suggère de supprimer l'expression régulière et d'utiliser simplement stristr pour vérifier si elle correspond. Quelque chose comme cela devrait fonctionner:

<?php 
// Fill out as needed 
$domains = array('secondgearsoftware.com', 'secondgearllc.com'); 

$email = urldecode($_POST['email']); 
$found = false; 
for(i=0;i<count($domains);i++) 
{ 
    if ($domains[i] == stristr($email, $domains[i])) 
     $found = true; 
} 

if ($found) ... 
?> 

La fonction stristr renvoie l'adresse e-mail de la partie où il a trouvé un match à la fin, ce qui devrait être le même que le match dans ce cas. Techniquement, il pourrait y avoir quelque chose avant les domaines (fkdskjfsdksfks.secondgeartsoftware.com), mais vous pouvez simplement insérer "@ domainneeded.com" pour éviter cela. Ce code est également légèrement plus long, mais facilement étendu avec de nouveaux domaines sans se soucier de regex.

+0

propre Beaucoup. Merci! la seule chose est que vos variables i doivent être $ i, non? –

+0

Ceci est faux. Cela permettra toute composition bizarre des noms de domaine, même dans la partie du nom d'utilisateur. Ne l'utilisez pas si vous voulez une protection réelle. – BYK

+0

@Justin: Trop de programmation en C de ma part. Utilisez $ i ofcourse;) @BYK: Si vous entrez [email protected], stristr retournera le tout, et la comparaison == retournera false. Le seul cas où il renvoie true est si la dernière partie de l'adresse de messagerie est la même que celle du domaine, ce qui correspond à ce que l'utilisateur a demandé. –

1

Vous devez probablement utiliser /\b[A-Z0-9\._%+-][email protected]((euro\.|asia\.)secondgearsoftware|secondgearllc)\.com/i (notez le i à la fin) afin de rendre l'expression régulière insensible à la casse. J'ai également laissé tomber le + s car ils permettent une répétition infinie qui n'a pas de sens dans ce cas.

1

Votre expression régulière est un peu au large (il permettra [email protected]) et peut être simplifiée:

$pattern = '/@((euro\.|asia\.)?secondgearsoftware|secondgearllc)\.com$/i'; 

Je l'ai fait insensible à la casse et à la fin mouillais de la chaîne .

Il ne semble pas nécessaire de vérifier ce qui se trouve avant le "@" - vous devriez avoir une routine de validation appropriée pour cela si nécessaire, mais il semble que vous voulez juste vérifier si l'adresse email appartient à l'un des ces domaines.

1

est ici un outil facile à maintenir la solution en utilisant des expressions régulières

$domains = array(
    'secondgearsoftware', 
    'secondgearllc', 
    'euro\.secondgearsoftware', 
    'asia\.secondgearsoftware' 
); 
preg_match("`@(" .implode("|", $domains). ")\.com$`i", $userProvidedEmail); 

Voici quelques tests:

$tests = array(
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]' 
); 

foreach ($tests as $test) { 
    echo preg_match("`@(" .implode("|", $domains). ")\.com$`i", $test), 
     " <- $test\n"; 
} 

Résultat (1 passe bien sûr)

1 <- [email protected] 
1 <- [email protected] 
0 <- [email protected] 
0 <- [email protected] 
0 <- [email protected] 
1 <- [email protected] 
0 <- [email protected] 
1 <- [email protected].secondgearsoftware.com 
+0

Ceci est facile à utiliser, mais il introduit un succès de performance en raison de la construction de la matrice supplémentaire et la fonction d'implosion . – BYK

+0

Cette implémentation est avantageuse et nécessaire dans les cas où la liste des domaines valides est mutable ou si une généralisation est nécessaire. Sinon, si la liste des domaines valides n'est pas souvent modifiée, je ne ferais que le coder en dur. Mais, étant donné que la liste est petite, les problèmes de performance sont négligeables. –

Questions connexes