我正在尝试创建一个脚本,只有当用户输入的电子邮件地址来自特定域时才会执行其操作。我创建了一个正则表达式,通过正则表达式实用程序测试它似乎工作,但当它在我的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';
}
我不确定这种模式的未来。任何帮助将不胜感激。
答案 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”来防止这种情况发生。此代码也稍长,但可以轻松扩展新域,而无需担心正则表达式。