2009-11-30 33 views
0

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

$pattern = '/\b[A-Z0-9\._%+-][email protected]((secondgearsoftware|secondgearllc|euro\.secondgearsoftware|asia\.secondgearsoftware)+\.)+com/'; 
$email = urldecode($_POST['email']); 
if (preg_match($pattern, $email)) 
{ 
    echo 'success'; 
} 
else 
{ 
    echo 'opposite success'; 
} 

我不太确定什么是模式。任何帮助,将不胜感激。

回答

-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”来防止出现这种情况。此代码也稍长一些,但可以轻松扩展新域名而不用担心正则表达式。

+0

干净多了。谢谢!唯一的事情是你的i变量应该是$ i,不是? – 2009-11-30 21:32:37

+0

这是错误的。这将允许任何奇怪的域名组成,即使在用户名部分。如果你想得到真正的保护,不要使用它。 – BYK 2009-11-30 22:15:37

+0

@Justin:我的编程太多了。使用$ i ofcourse;) @BYK:如果您输入secondgearsoftware[email protected],stristr会将其全部返回,并且==比较将返回false。它返回true的唯一情况是,如果电子邮件地址的最后部分与域相同,则执行用户要求的内容。 – 2009-12-01 11:08:40

1

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

1

你的正则表达式是有点过(它将允许[email protected]),并且可以被简化:

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

我找到了不区分大小写和它锚定至串的末尾。

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

1

下面是一个简单的使用正则表达式

$domains = array(
    'secondgearsoftware', 
    'secondgearllc', 
    'euro\.secondgearsoftware', 
    'asia\.secondgearsoftware' 
); 
preg_match("`@(" .implode("|", $domains). ")\.com$`i", $userProvidedEmail); 

维护解决方案下面是几个测试:

$tests = array(
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]', 
    '[email protected]' 
); 

foreach ($tests as $test) { 
    echo preg_match("`@(" .implode("|", $domains). ")\.com$`i", $test), 
     " <- $test\n"; 
} 

结果(1路过当然)

1 <- [email protected] 
1 <- [email protected] 
0 <- [email protected] 
0 <- [email protected] 
0 <- [email protected] 
1 <- [email protected] 
0 <- [email protected] 
1 <- [email protected] 
+0

这很容易使用,但由于附加的数组构造和implode函数。 – BYK 2009-11-30 22:14:04

+0

如果有效域列表是可变的或泛化是必要的,则此实现是有利的和必要的。否则,如果有效域的列表不会经常更改,我只需要对其进行编码。但是,由于名单很小,性能问题可以忽略不计。 – 2009-12-01 00:01:05

相关问题