Php 仅当输入的电子邮件来自特定域时才执行脚本

Php 仅当输入的电子邮件来自特定域时才执行脚本,php,regex,preg-match,Php,Regex,Preg Match,我正在尝试创建一个脚本,该脚本仅在用户输入的电子邮件地址来自特定域时才会执行其操作。我创建了一个正则表达式,当通过正则表达式实用程序测试它时,它似乎可以工作,但当它在我的PHP脚本中使用时,它告诉我有效的电子邮件是无效的。在这种情况下,我希望任何来自@secondgearsoftware.com、@secondgearllc.com或asia.secondgearsoftware.com的电子邮件都被拒绝,以回应success和所有其他邮件 $pattern = '/\b[A-Z0-9\._%+

我正在尝试创建一个脚本,该脚本仅在用户输入的电子邮件地址来自特定域时才会执行其操作。我创建了一个正则表达式,当通过正则表达式实用程序测试它时,它似乎可以工作,但当它在我的PHP脚本中使用时,它告诉我有效的电子邮件是无效的。在这种情况下,我希望任何来自@secondgearsoftware.com、@secondgearllc.com或asia.secondgearsoftware.com的电子邮件都被拒绝,以回应success和所有其他邮件

$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';
}

我真的不确定这个模式究竟是什么。任何帮助都将不胜感激。

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

您的正则表达式有点不正确(它将允许foo@secondgearsoftwaresecondgearsoftware.com)可以简化为:

$pattern = '/@((euro\.|asia\.)?secondgearsoftware|secondgearllc)\.com$/i';
我已经使它不区分大小写,并将它锚定到字符串的末尾


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

我建议您删除正则表达式,只需使用它检查是否匹配。像这样的方法应该会奏效:

<?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”以防止出现这种情况。这段代码也稍微长一点,但很容易用新的域进行扩展,而不用担心正则表达式。

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

$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";
}
$tests=数组(
'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作为$test){
echo preg_match(“`@(“.intlode(“|”),$domains)。”\.com$`i',$test),

“更干净。谢谢!唯一的问题是你的i变量应该是$i,不是吗?这是错误的。这将允许域名的任何奇怪组合,即使是在用户名部分。如果你想要真正的保护,就不要使用它。@Justin:我的C编程太多了。当然要使用$i;)@BYK:如果你进入SecondGear软件。com@somethingelse,stristr将返回全部,并且==比较将返回false。返回true的唯一情况是如果电子邮件地址的最后一部分与域相同,因此执行用户要求的操作。太多的c编程…使用foreach no$i needed…foreach($domains as$domain){这很容易使用,但由于额外的数组构造和内爆函数,它会导致性能下降。在有效域列表是可变的或需要泛化的情况下,这种实现是有利的和必要的。否则,如果有效域列表不经常更改,我只会硬c但是,由于列表很小,性能问题可以忽略不计。
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