Выполнять сценарий только в том случае, если введенный адрес электронной почты принадлежит определенному домену
-
10-07-2019 - |
Вопрос
Я пытаюсь создать сценарий, который будет выполнять свои действия только в том случае, если введенный пользователем адрес электронной почты относится к определенному домену. Я создал регулярное выражение, которое, кажется, работает при тестировании с помощью утилиты регулярных выражений, но когда оно используется в моем сценарии PHP, оно говорит мне, что действительные электронные письма недействительны. В этом случае я хочу, чтобы любое электронное письмо от @ secondgearsoftware.com, @ secondgearllc.com или asia.secondgearsoftware.com отражало успех, а все остальные отклонялись. Р>
$pattern = '/\b[A-Z0-9\._%+-]+@((secondgearsoftware|secondgearllc|euro\.secondgearsoftware|asia\.secondgearsoftware)+\.)+com/';
$email = urldecode( Я пытаюсь создать сценарий, который будет выполнять свои действия только в том случае, если введенный пользователем адрес электронной почты относится к определенному домену. Я создал регулярное выражение, которое, кажется, работает при тестировании с помощью утилиты регулярных выражений, но когда оно используется в моем сценарии PHP, оно говорит мне, что действительные электронные письма недействительны. В этом случае я хочу, чтобы любое электронное письмо от @ secondgearsoftware.com, @ secondgearllc.com или asia.secondgearsoftware.com отражало успех, а все остальные отклонялись. Р>
<*>
Я не совсем уверен, что связано с шаблоном. Любая помощь будет оценена.
POST['email']);
if (preg_match($pattern, $email))
{
echo 'success';
}
else
{
echo 'opposite success';
}
Я не совсем уверен, что связано с шаблоном. Любая помощь будет оценена.
Решение
Я предлагаю вам отказаться от регулярного выражения и просто использовать stristr , чтобы проверить, соответствует ли оно. Примерно так должно работать:
<?php
// Fill out as needed
$domains = array('secondgearsoftware.com', 'secondgearllc.com');
$email = urldecode( Я предлагаю вам отказаться от регулярного выражения и просто использовать stristr , чтобы проверить, соответствует ли оно. Примерно так должно работать:
<*>
Функция stristr возвращает адрес электронной почты от той части, где она нашла совпадение, до конца, который должен совпадать с совпадением в этом случае. Технически это может быть что-то до доменов (fkdskjfsdksfks.secondgeartsoftware.com), но вы можете просто вставить " @ domainneeded.com " чтобы предотвратить это. Этот код также немного длиннее, но его легко расширить новыми доменами, не беспокоясь о регулярных выражениях.
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 " чтобы предотвратить это. Этот код также немного длиннее, но его легко расширить новыми доменами, не беспокоясь о регулярных выражениях.
Другие советы
Ваше регулярное выражение немного не соответствует (оно разрешит foo@secondgearsoftwaresecondgearsoftware.com) и может быть упрощено:
$pattern = '/@((euro\.|asia\.)?secondgearsoftware|secondgearllc)\.com$/i';
Я сделал это без учета регистра и привязал его к концу строки.
Кажется, нет необходимости проверять, что находится до " @ " - у вас должна быть соответствующая процедура проверки для этого, если это необходимо, но, похоже, вы просто хотите проверить, принадлежит ли адрес электронной почты одному из этих доменов.
Возможно, вам нужно использовать / \ b [A-Z0-9 \ ._% + -] + @ ((евро \. | азия \.) secondgearsoftware | secondgearllc) \. com / i
(обратите внимание на i
в конце), чтобы сделать регулярное выражение без учета регистра. Я также отбросил +
, поскольку они допускают бесконечное повторение, что в данном случае не имеет смысла.
Вот простое в обслуживании решение с использованием регулярных выражений
$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 Вот простое в обслуживании решение с использованием регулярных выражений
$domains = array(
'secondgearsoftware',
'secondgearllc',
'euro\.secondgearsoftware',
'asia\.secondgearsoftware'
);
preg_match("`@(" .implode("|", $domains). ")\.com Вот простое в обслуживании решение с использованием регулярных выражений
i", $userProvidedEmail);
Вот пара тестов:
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