Выполнять сценарий только в том случае, если введенный адрес электронной почты принадлежит определенному домену

StackOverflow https://stackoverflow.com/questions/1822280

  •  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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top