我正在使用PHP preg_match
功能验证我们公司的电子邮件,其格式可以是user@mycompany.com
,也可以使用user@marketing.mycompany.com
或user@it.mycompany.com
等子域。
return (preg_match("/^[a-zA-Z0-9_-.+]+@[a-zA-Z0-9-]+.[a-zA-Z]+(\.?mycompany\.com)$/", $testEmail) > 0)
但是,对于我提到的所有上述示例,validEmail函数都返回false。为什么呢?
答案 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)
filter_var()
- 至少应该在99%与正则表达式相反的情况下正常工作。使用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 :(得分:2)
^[a-zA-Z0-9_.+-]+@(?:(?:[a-zA-Z0-9-]+\.)?[a-zA-Z]+\.)?mycompany\.com$
()?
),它排除了@ mycompany.com和@ onesubonly.mycompany.com .
关于电子邮件正则表达式主题的有趣之处(看到“.. @ mycompany.com”之类的东西会传递给你们): http://www.ex-parrot.com/pdw/Mail-RFC822-Address.html