0

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

4 回答 4

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
于 2009-11-30T21:53:11.433 回答
1

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

于 2009-11-30T20:49:05.907 回答
1

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

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

我使它不区分大小写并将其锚定到字符串的末尾。

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

于 2009-11-30T20:56:35.623 回答
-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”来防止这种情况。这段代码也稍长一些,但很容易用新域进行扩展,而不用担心正则表达式。

于 2009-11-30T21:16:33.927 回答