为什么这个用于验证特定域名电子邮件的正则表达不起作用?

时间:2012-03-05 21:25:23

标签: php regex

我正在使用PHP preg_match功能验证我们公司的电子邮件,其格式可以是user@mycompany.com,也可以使用user@marketing.mycompany.comuser@it.mycompany.com等子域。

return (preg_match("/^[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+(\.?mycompany\.com)$/", $testEmail) > 0)

但是,对于我提到的所有上述示例,validEmail函数都返回false。为什么呢?

4 个答案:

答案 0 :(得分:3)

假设你做了Jack Maney建议的修复:

匹配'@'字符后,您将匹配

[a-zA-Z0-9-]+\.[a-zA-Z]+(\.?mycompany\.com)$

所以它将无法匹配“blah@mycompany.com”,因为它必须匹配一个字母数字/连字符,然后是一个点,然后是一个字母,然后是(。?)mycompany.com。它将匹配“blah@a.b.mycompany.com”

要解决此问题,请尝试使用此正则表达式:

 /^[a-zA-Z0-9_-.+]+@([a-zA-Z0-9-]+\.)*mycompany\.com$/

注意,现在,在“@”之后,它允许0个或更多

个实例
 [a-zA-Z0-9-]+\.

代表子域名

答案 1 :(得分:2)

因为您忘了逃避.-。此外,不在"@"mycompany.com之间设置字符块会导致匹配user@mycompany.com的问题。尝试:

return (preg_match("/^[a-zA-Z0-9_\-.+]+@(?:[a-zA-Z0-9\-]+(?:\.[a-zA-Z])?)?(\.?mycompany\.com)$/", $testEmail) > 0)

答案 2 :(得分:2)

  1. 有内置的电子邮件验证功能 - filter_var() - 至少应该在99%与正则表达式相反的情况下正常工作。
  2. 使用parse_url() function从电子邮件地址获取主机名,并检查其是否以mycompany.com结尾:

    $hostname = parse_url($email, PHP_URL_HOST);
    
    if (substr($hostname, strlen('mycompany.com') * -1)) == 'mycompany.com') {
        // ends with "mycompany.com"
    }
    
  3. 结合上述内容检查指定的电子邮件地址是否符合您的条件。

答案 3 :(得分:2)

^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?mycompany\.com$
  • 第3级和第4级域名不是可选的(()?),它排除了@ mycompany.com和@ onesubonly.mycompany.com
  • 的所有内容
  • 你忘了逃避.
  • 我的语法检查不喜欢第一个字符类中未转义的短划线,但根据我的知识,它应该无关紧要。

关于电子邮件正则表达式主题的有趣之处(看到“.. @ mycompany.com”之类的东西会传递给你们): http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html