为什么我的代码不能针对特定域测试电子邮件地址?

时间:2011-08-14 15:32:41

标签: php

我想只允许特定的电子邮件域名。其实我做到了。我想问的是为什么我的第一个代码根本不起作用。

我只是想学习PHP,这个问题可能看起来很愚蠢,对不起。 这是我的代码:

function check_email_address($email) {      
    $checkmail = print_r (explode("@",$email));
    $container = $checkmail[1];
    if(strcmp($container, "gmail.com")) {
        return true;
    }else { 
        return false;
    }
}

5 个答案:

答案 0 :(得分:4)

查看strcmp()的文档,它将返回两个字符串中相同的0,因此这是您要进行的检查。此外,正如其他回答者所提到的那样,当你不应该使用时,你正在使用print_r()

无论如何,这就是我将如何完成这个功能 - 它更简单,只使用一行代码:

function check_email_address($email) {
    return (strtolower(strstr($email, '@')) == 'gmail.com');
}

它使用strstr()函数和strtolower()函数获取域名并将其更改为小写,然后检查它是否为gmail.com。然后它返回该比较的结果。

答案 1 :(得分:2)

这是因为你正在使用print_r。它完全不符合你的期望。删除它:

  $checkmail = explode("@", $email);

您可以在此处找到有关print_r的文档: http://php.net/print_r

除此之外,您可以使用以下内容(它更短):

$parts = explode("@", $email);
return (strcmp($parts[1], "gmail.com") == 0);

答案 2 :(得分:1)

以下行无法正常工作:

$checkmail = print_r (explode("@",$email));

这意味着您尝试将print_r()的返回值分配到$checkmail,但实际上并没有返回任何内容(如果您没有提供第二个可选参数价值true)。

即使这样,它也会得到一个包含数组结构的字符串,而$container的值为r,因为它是Array中的第二个字母。

结论:如果您的行没有拨打print_r(),那么它就会按计划运行(只要您确保将strcmp()与{{1}进行比较},因为这意味着字符串是相同的。)

0

有趣的是,我刚刚意识到这也可以通过使用Edit:来实现:

substr()

答案 3 :(得分:0)

不需要print_r; explode返回一个列表。在风格方面(至少我的风格)不需要将该列表的第N个元素分配给另一个变量,除非您打算在其他地方使用它。因此,

$c = explode('@',$mail);
if(strcmp($c[1],'gmail.com') == 0) return true;
return false;

答案 4 :(得分:0)

你想:

if(strcmp($container, "gmail.com")==0)

而不是

if(strcmp($container, "gmail.com"))

哦!当然没有内联print_r()

更好:

return strcmp($container, "gmail.com")==0;