2010-09-01 130 views
0

我在尝试使用preg_match(或eregi())验证电子邮件地址时遇到了一些问题,如果它更合适的话)。我已经尝试了几种正则表达式模式,无论我做什么似乎都不起作用。PHP - preg_match()和eregi()不工作?

这里的功能:

function validateEmail($email) { 

    if(eregi('[a-z||0-9]@[a-z||0-9].[a-z]', $email)){ 
     return true; 
    } 

} 

任何想法有什么不对?我已经尝试在eregi(和之前使用的preg_match)之前放置一个感叹号,并且将其全部逆转(如预期的那样),但仍未使其正常工作。如果它不传递正则表达式,我希望它返回TRUE。

而我在preg_match函数时没有使用相同的正则表达式,于是我发现了另一个正则表达式,因为我知道你不能混合这两个。对?

在此先感谢!

+0

这不是一个正确的正则表达式。 '[]'只匹配一个字符,'.'被视为匹配*任何*字符的特殊字符,而不是'.'。一个更正确的正则表达式可能是:'[a-z0-9] + @ [a-z0-9] + \。[a-z] {2,4}',尽管如此nikic所说的也太严格了。 – Frxstrem 2010-09-01 14:09:58

+0

你的正则表达式也不起作用,所以我不认为这是正确的正则表达式。 – Nike 2010-09-01 14:15:40

回答

8

你应该通过filter_var使用过滤扩展功能:

filter_var($email, FILTER_VALIDATE_EMAIL); 

如果你想有一个正则表达式,不要使用严格的规则,或者我[email protected]域名将被拒绝。使用类似~[^@][email protected](?:[^.]+\.)+[A-Za-z]{2,6}~的东西。虽然这仍然不允许有效的电子邮件,如"\@"@example.org

PS:如果你想知道为什么你的正则表达式不起作用:

  • eregi已过时,使用的preg_match代替
  • []不写||。只需使用[a-z0-9]即可。 ||只需另外允许|字符
  • 您忘记了量词到处都是+。知道每个部分可能只有一个字符。

与所有这些东西固定的(但请不要使用这个表达式!):

preg_match('~[a-z0-9][email protected][a-z0-9]+.[a-z]+~i', $email); 
+0

我甚至不知道存在,但听起来不错。但由于某些原因,它仍然不起作用。 – Nike 2010-09-01 14:11:24

+0

究竟是不行的? – NikiC 2010-09-01 14:12:59

+0

无论我输入什么,它都会返回false。我可以留空并提交表单,但它仍然返回false。如果我输入有效的电子邮件,也是如此。如果我在preg_match之前放了一个感叹号,它会颠倒这个动作并且无论您提交什么都会返回true。 – Nike 2010-09-01 14:16:45

2

只是为了澄清一些东西,ereg折旧。

要转换到preg_match这将是:

if(preg_match('/[a-z||0-9]@[a-z||0-9].[a-z]/', $email)){ 

大多数(我用这个词松散)ereg的刚需分隔符(第一个和最后一个/)添加到转换为preg_match

+0

非常感谢,很高兴知道。 :) – Nike 2010-09-01 14:17:06