Выполнять сценарий только в том случае, если введенный адрес электронной почты принадлежит определенному домену - PullRequest
0 голосов
/ 30 ноября 2009

Я пытаюсь создать скрипт, который будет выполнять свои действия только в том случае, если адрес электронной почты, который вводит пользователь, относится к конкретному домену. Я создал регулярное выражение, которое, кажется, работает при тестировании с помощью утилиты регулярных выражений, но когда оно используется в моем сценарии PHP, оно говорит мне, что действительные электронные письма недействительны. В этом случае я хочу, чтобы любое электронное письмо от @ secondgearsoftware.com, @ secondgearllc.com или asia.secondgearsoftware.com отражало успех, а все остальные отклонялись.

$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';
}

Я не совсем уверен, что связано с шаблоном. Любая помощь будет оценена.

Ответы [ 4 ]

1 голос
/ 01 декабря 2009

Вот простое в обслуживании решение с использованием регулярных выражений

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

Вот пара тестов:

$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 проходит, конечно)

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
1 голос
/ 30 ноября 2009

Ваше регулярное выражение немного не соответствует (оно разрешит foo@secondgearsoftwaresecondgearsoftware.com) и может быть упрощено:

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

Я сделал это без учета регистра и привязал его к концу строки.

Похоже, нет необходимости проверять, что находится перед «@» - у вас должна быть соответствующая процедура проверки для этого, если это необходимо, но, похоже, вы просто хотите проверить, принадлежит ли адрес электронной почты одному из этих домены.

1 голос
/ 30 ноября 2009

Возможно, вам нужно использовать /\b[A-Z0-9\._%+-]+@((euro\.|asia\.)secondgearsoftware|secondgearllc)\.com/i (обратите внимание на i в конце), чтобы сделать регулярное выражение нечувствительным к регистру. Я также отбросил + с, поскольку они допускают бесконечное повторение, что в этом случае не имеет смысла.

0 голосов
/ 01 декабря 2009

Я предлагаю вам отказаться от регулярного выражения и просто использовать stristr , чтобы проверить, соответствует ли оно. Примерно так должно работать:

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

Функция stristr возвращает адрес электронной почты от той части, где она нашла совпадение, до конца, который должен совпадать с совпадением в этом случае. Технически, перед доменами может быть что-то (fkdskjfsdksfks.secondgeartsoftware.com), но вы можете просто вставить «@ domainneeded.com», чтобы предотвратить это. Этот код также немного длиннее, но его легко расширить новыми доменами, не беспокоясь о регулярных выражениях.

...