如果输入的电子邮件来自特定域,则仅执行脚本

时间:2009-11-30 20:45:07

标签: php regex preg-match

我正在尝试创建一个脚本,只有当用户输入的电子邮件地址来自特定域时才会执行其操作。我创建了一个正则表达式,通过正则表达式实用程序测试它似乎工作,但当它在我的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 个答案:

答案 0 :(得分:1)

您可能需要使用/\b[A-Z0-9\._%+-]+@((euro\.|asia\.)secondgearsoftware|secondgearllc)\.com/i(请注意最后的i),以使正则表达式不区分大小写。我也放弃了+,因为它们允许无限重复,在这种情况下没有意义。

答案 1 :(得分:1)

您的正则表达式有点偏离(它将允许foo@secondgearsoftwaresecondgearsoftware.com)并且可以简化:

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

我已将其设置为不区分大小写,并将其锚定在字符串的末尾。

似乎没有必要检查“@”之前的内容 - 如果有必要,您应该有一个适当的验证例程,但似乎您只想检查电子邮件地址是否属于其中一个域。

答案 2 :(得分:1)

这是一个易于维护的解决方案,使用正则表达式

$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

答案 3 :(得分:-1)

我建议您删除正则表达式,只需使用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”来防止这种情况发生。此代码也稍长,但可以轻松扩展新域,而无需担心正则表达式。