2011-08-02 42 views
15

我需要写一个项目的功能,我正在努力的乐趣,我们正在做一个网站只有学生,工作人员和校友的校友。PHP检查域名的电子邮件被注册是'school.edu'地址

假设学校网站是:school.edu。

我无法写一个PHP过滤器检查所提交的电子邮件地址具有“school.edu”

我会用一个例子的域。老兄#1有一个[email protected]的电子邮件,老兄#2有一个电子邮件在[email protected]。我想确保Dude 1得到错误信息,并且Dude#2已经成功注册。

这就是我想要做的事情的要点。在不久的将来,该网站将允许另外两个现场学校注册:school2.edu和school3.edu。然后,我将需要检查器来检查电子邮件与一个小列表(也许是一个阵列?)的域,以验证该电子邮件是列表中的域名。

+1

你们又想出?你开始写任何东西,或者研究[php的正则表达式](例如http://php.net/manual/en/book.regex.php)?另外来自其他国家的学术注册者如英国(与'.ac.uk' tld)? –

+0

[email protected] - 他可能会为你提供一些指引......或者你可以找到一个winklevi,他们在这里有一些经验。 –

+0

现在它只适合一些当地的学校。我们几乎完成了整个网站的编码工作。只需添加一些最终功能,例如电子邮件验证脚本。 – Phil

回答

30

有一定几种方法来检查,这里是我想出了我的头顶部:

$email = $_POST['email']; 
$allowed = array('school.edu', 'school2.edu', 'school3.edu'); 

// Make sure the address is valid 
if (filter_var($email, FILTER_VALIDATE_EMAIL)) 
{ 
    $explodedEmail = explode('@', $email); 
    $domain = array_pop($explodedEmail); 

    if (! in_array($domain, $allowed)) 
    { 
     // Not allowed 
    } 

} 

explode()@字符字符串分隔(应该只有一个,反正,所以也许substr()会稍微更有效率),并且array_pop()删除并返回最后一个,这应该是@之后的所有内容,并且是电子邮件的域。

可能有一个更好或更简洁的方法,但这应该工作不管。

+1

就像一个额外的建议,并且这可能适用于所有文本输入,请记住在提交的值上运行trim(),以防某人在电子邮件地址 – thorne51

4

您可以使用正则表达式:

if(preg_match('/^\[email protected]\.edu$/i', $source_string) > 0) 
    //valid 

现在进行我撕成碎片吧的评论,因为有一些疯狂的电子邮件地址的功能,我没有考虑:)

1

你总是可以这样做这样的:

$good_domains = array('school.edu'); //in the future, just add to this array for more schools 

$email = "[email protected]"; //your user's email 

$matches = array(); 
preg_match("/^(.+)@([^\(\);:,<>]+\.[a-zA-Z]{2,4})/", $email, &$matches); //validates the email and gathers information about it simultaneously 
//should return ['[email protected]', 'user', 'mail.com'] 
$domain = $matches[3]; 

if(in_array($domain, $goood_domains)) 
{ 
    //success! your user is from school.edu! 
} 
else 
{ 
    //oh no! an imposter! 
} 
3

我只是这样做:

$acceptedDomains = array('site1.edu', 'site2.edu'); 

if(in_array(substr($email, strrpos($email, '@') + 1), $acceptedDomains)) 
{ 
    // Email is from a domain in $acceptedDomains 
} 

'whatever.edu'部分将始终在@之后。因此,您需要做的只是:

  1. 查找字符串中最后一次出现的@。 (在一个正常的电子邮件中,将只有之一,但在这里并不重要。)
  2. 获取@之后的部分电子邮件。这将是域名。
  3. 使用in_array()将域名与$acceptedDomains中接受的域列表进行比较。

请注意,如果您还想接受来自[email protected]的电子邮件,则需要多做一点,但这可能适用,也可能不适用。我还假设你在做这件事之前已经验证过电子邮件地址是正确的。

5

请注意,因为电子邮件地址为[email protected],所以@后的所有内容可能无法完成您正在尝试完成的任务。下面的get_domain函数只会将域名下放到第二级域名。它会为[email protected][email protected]返回“unc.edu”。 此外,您可能要考虑具有国家代码的域(其顶级域名为2个字符)。

您可以使用下面的函数来提取域。然后,您可以使用一系列学校网域,或将学校网域放入数据库中,并根据该网址检查电子邮件地址。

function get_domain($email) 
    { 
     if (strrpos($email, '.') == strlen($email) - 3) 
      $num_parts = 3; 
     else 
      $num_parts = 2; 

     $domain = implode('.', 
      array_slice(preg_split("/(\.|@)/", $email), - $num_parts) 
     ); 

     return strtolower($domain); 
    } 


    // test the function 
    $school_domains = array('unc.edu', 'ecu.edu'); 

    $email = '[email protected]'; 

    if (in_array(get_domain($email), $school_domains)) 
    { 
     echo "good"; 
    } 
3

简单和单线:

 list($name, $domain) = explode('@', $email); 
相关问题