使用正则表达式验证电子邮件地址

时间:2011-04-20 22:16:45

标签: php regex

我刚刚开始学习编写PHP和HTML的代码,看看有关正则表达式的一些教程,但很难理解这些是什么意思。我感谢任何帮助。

例如,我想验证电子邮件地址peanuts@monkey.com。我从代码开始,我收到消息无效的电子邮件地址。

  1. 我做错了什么?
  2. 我知道元字符如^表示字符串的开头而$表示字符串的结尾但这是什么意思?什么是字符串的开头,字符串的结尾是什么?
  3. 何时对正则表达式进行分组?
  4. $emailaddress = 'peanuts@monkey.com';
    
    if(preg_match('/^[a-zA-z0-9]+@[a-zA-z0-9]+\.[a-zA-z0-9]$/', $emailaddress)) {
        echo 'Great, you have a valid email address';       
    } else {
        echo 'boo hoo, you have an invalid email address';      
    }
    

6 个答案:

答案 0 :(得分:5)

如果您想要使用的话,您所写的内容可以进行一些小修改,但最后会错过“+”。

1)

 ^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$ 

2)

胡萝卜和美元字符匹配的位置而不是字符,^等于行的开头,$等于行的结尾,它们用于锚定你的正则表达式。如果你在没有这两个的情况下编写你的正则表达式,你将匹配文本中任何地方的电子邮件地址,而不仅仅是在这种情况下单行的电子邮件地址。如果您只写了^(胡萝卜),那么您会找到该行开头的每个电子邮件地址,如果您只写了$(美元),那么您将只找到该行末尾的电子邮件地址。

  Blah blah blah someEmail@email.com   等等等等

不会给你一个匹配,因为你没有一个电子邮件地址在行的开头,并且该行也没有以它终止,所以为了在这个上下文中匹配它你必须删除^和$。< / p>

3)据我所知,分组使用有两个原因:返回引用和...分组。使用分组的原因与数学相同,1 + 3 * 4与(1 + 3)* 4不同。您使用括号来约束量词,例如'+','*'和'?'以及交替'|'等。

您也可以使用括号进行反向引用,但由于我无法更好地解释它,我会将您链接到:http://www.regular-expressions.info/brackets.html

我会鼓励你看一下这本书,即使你只读了前2-3章,你会学到很多东西,这本书很棒! http://oreilly.com/catalog/9781565922570


正如评论员所说的那样,这个正则表达式并不完美,但它有效,并向你展示你忘记了什么。你离我不远!


按要求更新:

'+','*'和'?'量词。并且也是您分组的一个很好的例子。

  • '+'表示匹配任何charachter之前或组1或n次。
  • '*'表示匹配任何charachter前面的0或n次。
  • '?'意味着匹配任何charachter在它之前或组0或1时间。

n次意义(无限期)

你使用[a-zA-Z0-9] +的原因是没有'+'它只会匹配一个字符。使用+它将匹配许多但它必须匹配至少一个。有*它匹配很多但也是0,和?最多匹配1个字符,但也匹配0。

答案 1 :(得分:4)

您的正则表达式与电子邮件地址不符。试试这个:

/\b[\w\.-]+@[\w\.-]+\.\w{2,4}\b/

我建议您通读this tutorial以了解正则表达式。

此外,RegExr非常适合测试它们。

至于你的第二个问题; ^字符表示正则表达式必须从您输入的字符串中的第一个字符开始匹配。 $表示正则表达式必须以您输入的字符串中的最后一个字符结束。实质上,这意味着您的正则表达式将匹配以下字符串:

  

peanuts@monkey.com

但不是以下字符串:

  

我的电子邮件地址是peanuts@monkey.com,我很喜欢!

对正则表达式进行分组有很多用例。使用匹配组也可以使表达更清晰,更易读。在我之前链接的教程中,这一切都得到了很好的解释。


正如CanSpice指出的那样,匹配所有可能的电子邮件地址并非易事。使用RFC2822电子邮件验证表达式可以做得更好:

/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/

有许多替代方案,但即使是最简单的方法也能做得很好,因为大多数电子邮件地址都以.com(或其他2-4个字符长度的顶级域名)结尾。


原始表达式不起作用的唯一原因是您将表达式中句点(。)后面的字符数限制为1.将表达式更改为:

/^[a-zA-z0-9]+@[a-zA-z0-9]+\.[a-zA-z0-9]+$/

允许在最后一个时期后面有无限数量的字符。

/^[a-zA-z0-9]+@[a-zA-z0-9]+\.[a-zA-z0-9]{2,4}$/

允许在最后一个时段后面2到4个字符。这将匹配:

  

name@email.com

     

name@email.info

但不是:

  

fake@address.suckers

答案 2 :(得分:1)

顶级域名(“。com”,“。net”,“。museum”)可以是2到6个字符。所以你应该说2,6而不是2,4。

几年前我写了一篇非常好的电子邮件地址正则表达式:

^ \ W +([ - + ._] \ W +)的 @(\ W +(( - +)|))。 \ W {1,63} [A-ZA-Z ] {2,6-} $

进行了大量研究。但我有一些基本提示:

不要只是复制粘贴!如果有人说“这是一个伟大的正则表达式”,不要只是复制粘贴它!了解发生了什么!正则表达式并不难。一旦你很好地学习它们,它将永远带来红利。我在大学里参加了Perl课程,从而擅长于他们。从那以后,我几乎没有变得更好,并且比我认识的绝大多数程序员更好。这是可悲的。无论如何,要学习它!

从小处开始。而不是构建一个巨大的正则表达式并在完成后测试它,只测试几个字符。例如,在编写电子邮件验证程序时,为什么不尝试\ w + @ \ w +。\ w +并查看它有多好?添加一些东西并重新测试。喜欢^ \ w + @ \ w +。[A-Za-z] {2,6} $

答案 3 :(得分:0)

正则表达式字符串的开头和结尾意味着在指定的字符之前或之后不能出现任何内容。您的正则表达式字符串需要考虑下划线,需要大写字母Zs与您的资本范围,以及其他调整。

/^[a-zA-Z_0-9]+@[a-zA-Z0-9]+\.[a-zA-z0-9]{2,4}$/

{2,4}表示顶级域名介于2到4个字符之间。

答案 4 :(得分:0)

这将验证任何电子邮件地址(至少我已经尝试了很多)

preg_match("/^[a-z0-9._-]{2,}+\@[a-z0-9_-]{2,}+\.([a-z0-9-]{2,4}|[a-z0-9-]{2,}+\.[a-z0-9-]{2,4})$/i", $emailaddress);

希望它有效!

答案 5 :(得分:-1)

确保你总是逃脱元字符(如点):

if(preg_match('/^[a-zA-z0-9]+@[a-zA-z0-9]+\.[a-zA-z0-9]$/', $emailaddress)) {