Frage

Ich versuche, ein Skript zu erstellen, die seine Aktionen nur ausführen, wenn die E-Mail-Adresse gibt den Benutzer aus einer bestimmten Domäne ist. Ich habe einen regulären Ausdruck, die zu funktionieren scheint, wenn es über regex Dienstprogramm testen, aber wenn sein in meinem PHP-Skript verwendet, es sagt mir, dass gültige E-Mails ungültig sind. In diesem Fall möchte ich eine E-Mail, die von @ ist secondgearsoftware.com, @ secondgearllc.com oder asia.secondgearsoftware.com Erfolg und alle anderen Echo zurückgewiesen werden.

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

Ich bin nicht wirklich sicher, was mit dem Muster futzed ist. Jede mögliche Hilfe würde geschätzt.

War es hilfreich?

Lösung

Ich schlage vor, Sie die Regex fallen und einfach verwenden stristr zu überprüfen, ob es passt. So etwas sollte funktionieren:

<?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) ...
?>

Die Funktion stristr die E-Mail-Adresse aus dem Teil zurück, wo er eine Übereinstimmung mit dem Ende gefunden, die das gleiche wie das Spiel in diesem Fall sein sollten. Technisch könnte es etwas vor den Domänen (fkdskjfsdksfks.secondgeartsoftware.com) sein, aber man kann einfach einfügen „@ domainneeded.com“, dies zu verhindern. Dieser Code ist auch etwas länger, aber leicht erweitert mit neuen Domains ohne sich Gedanken über regex.

Andere Tipps

Ihr regulärer Ausdruck ist ein bisschen weg (es foo@secondgearsoftwaresecondgearsoftware.com ermöglicht) und kann vereinfacht werden:

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

Ich habe es Groß- und Kleinschreibung gemacht und verankert es bis zum Ende des Strings.

Es scheint keine Notwendigkeit, zu überprüfen, was vor dem „@“ - Sie eine richtige Validierungsroutine dafür haben sollten, wenn nötig, aber es scheint, Sie wollen einfach nur überprüfen, ob die E-Mail-Adresse eines davon gehört Domains.

Sie müssen wahrscheinlich /\b[A-Z0-9\._%+-]+@((euro\.|asia\.)secondgearsoftware|secondgearllc)\.com/i (man beachte die i am Ende) verwenden, um die Regex Groß- und Kleinschreibung zu machen. Ich ließ auch die +s wie sie für unendliche Wiederholung ermöglichen, die keinen Sinn in diesem Fall machen.

Hier ist eine einfache Lösung, mit regulären Ausdrücken halten

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

Hier ein paar Tests:

$tests = array(
    'bob@secondgearsoftware.com',
    'bob@secondgearllc.com',
    'bob@Xsecondgearllc.com',
    'bob@secondgearllc.net',
    'bob@euro.secondgearsoftware.org',
    'bob@euro.secondgearsoftware.com',
    'bob@euroxsecondgearsoftware.com',
    'bob@asia.secondgearsoftware.com'
);

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

(1 vergeht natürlich)

1 <- bob@secondgearsoftware.com
1 <- bob@secondgearllc.com
0 <- bob@Xsecondgearllc.com
0 <- bob@secondgearllc.net
0 <- bob@euro.secondgearsoftware.org
1 <- bob@euro.secondgearsoftware.com
0 <- bob@euroxsecondgearsoftware.com
1 <- bob@asia.secondgearsoftware.com
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top