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

Pea*_*key 2 php regex

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

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

  1. 我究竟做错了什么?
  2. 我知道元字符如^表示字符串的开头而$表示字符串的结尾但这是什么意思?字符串的开头是什么,字符串的结尾是什么?
  3. 我何时将正则表达式分组?

 

$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';      
}
Run Code Online (Sandbox Code Playgroud)

Hub*_*bro 5

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

/\b[\w\.-]+@[\w\.-]+\.\w{2,4}\b/
Run Code Online (Sandbox Code Playgroud)

我建议您通读本教程,以了解正则表达式。

另外,RegExr非常适合对其进行测试。

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

花生@ monkey.com

但不是以下字符串:

我的电子邮件地址是花生米@ 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])?/
Run Code Online (Sandbox Code Playgroud)

有很多选择,但是即使最简单的选择也可以胜任,因为大多数电子邮件地址都以.com结尾(或其他2-4个字符长的顶级域名)。


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

/^[a-zA-z0-9]+@[a-zA-z0-9]+\.[a-zA-z0-9]+$/
Run Code Online (Sandbox Code Playgroud)

上一个句号后面将包含无限数量的字符。

/^[a-zA-z0-9]+@[a-zA-z0-9]+\.[a-zA-z0-9]{2,4}$/
Run Code Online (Sandbox Code Playgroud)

上一个句号后面将允许2到4个字符。那将匹配:

name@email.com

name@email.info

但不是:

假@地址。吸盘


Luc*_*uke 5

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

1)

 ^[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+$ 
Run Code Online (Sandbox Code Playgroud)

2)

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

Blah blah blah someEmail@email.com blah blah

不会给你一个匹配,因为你没有在行的开头有一个电子邮件地址,并且该行也没有以它终止,所以为了在这种情况下匹配它你必须删除^和$.

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.

  • 我认为阅读全面的教程是您所需要的.如果您阅读[本教程](http://gnosis.cx/publish/programming/regular_expressions.html)并查看示例,则此注释线程可能是多余的. (2认同)