允许+在正则表达式电子邮件中验证电子邮件

问题描述:

正则表达式正在让我迷失。我怎样才能改变这一点来验证带有加号的电子邮件?所以我可以在申请时[email protected]允许+在正则表达式电子邮件中验证电子邮件

if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/i", $_GET['em'])) { 
+0

该正则表达式对电子邮件地址的工作。你试过了吗? – Jeff 2011-03-31 16:38:24

+0

可能重复的[如何验证电子邮件在PHP?](http://*.com/questions/5855811/how-to-validate-an-email-in-php) – kapa 2014-06-10 22:20:43

看起来你并不是真正熟悉你的正则表达式正在做什么,这将是修改它之前的一个好的第一步。让我们通过你的正则表达式使用的电子邮件地址[email protected](以下每个部分,粗体的部分就是由部分匹配)走:

  1. ^start of string anchor。 它指定任何匹配必须 开始在 字符串的开头。如果锚图案不是 ,那么正则表达式引擎可以匹配 子字符串,这通常是不期望的 。

    锚点是零宽度,这意味着它们不会捕获任何字符。

  2. [_a-z0-9-]+由两个 元件,一个character classrepetition modifer

    • [...]定义一个字符类,它告诉正则表达式引擎, 这些字符任何有效匹配。在这种情况下,类 包含字符az,数字 0-9和破折号和下划线(在 一般,在字符类 破折号限定一个范围,因此可以使用的 a-z代替 abcdefghijklmnopqrstuvwxyz;当 作为 类中的最后一个字符给出,它充当字面破折号)。
    • +是一个重复修饰符,它指定可以重复一次或多次前面的令牌 (在此例中为字符类) 。 还有两个其他重复 经营者:*匹配零或更多 次; ?完全匹配零或 一次(即,使得东西 可选)。

    (捕捉 约翰 .robert.smith @ mail.com)

  3. (\.[_a-z0-9-]+)*又包含 重复字符类。它还 包含 group, 和转义字符:

    • (...)定义的基团,它允许用户将多个令牌 在一起(在此情况下,组 将重复为 整体) 。
      假设我们想要 匹配'abc',零次或多次(即 abcabcabc匹配,abcccc不匹配)。 如果我们试图使用 abc*模式,则重复修改器 只适用于c,因为 c是 修饰符之前的最后一个令牌。为了避开 这个,我们可以将abc((abc)*), 分组,在这种情况下,修饰符 适用于整个组,就好像它是 是单个标记一样。
    • \.指定了一个文字点字符。这是需要的原因 是因为.是正则表达式中的一个特殊的 字符,意思是any character。 既然我们想匹配一个实际的点 字符,我们需要逃避它。

    (捕获 约翰.robert.smith @ mail.com)

  4. @不 正则表达式特殊字符,所以,像所有其他 非特殊字符,它匹配 从字面上。
    (捕获john.robert.smith @ mail.com)

  5. [a-z0-9-]+再次限定了重复字符类,像上述项目#2。
    (捕获john.robert.smith @邮件 .COM)

  6. (\.[a-z0-9-]+)*几乎完全相同的图案与上述#3。
    (捕获[email protected] .COM

  7. $是串锚固件的端部。它与上面的^的工作方式相同,只是匹配字符串的末尾。


考虑到这一点,它应该是更清楚一点如何添加栏目,捕捉一个加号段。正如我们上面看到的,+是一个特殊字符,所以它必须被转义。然后,由于+必须跟随一些字符,我们可以用我们想要匹配的字符来定义一个字符类并定义它的重复。最后,我们应该让全组可选的,因为电子邮件地址并不需要有一个+段:

(\+[a-z0-9-]+)? 

当插入您的正则表达式,它会是这样的:

/^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)[email protected][a-z0-9-]+(\.[a-z0-9-]+)*$/i 
+0

那么保持\ \。以及?不应该在[] – wesbos 2011-03-31 16:45:50

+0

@Wes中表达什么意思? – 2011-03-31 16:47:06

+0

我当前的正则表达式显示(\。[_ a-z0-9 - ] +),我是否有它(\ + \。[_ a-z0-9 - ] +? – wesbos 2011-03-31 16:48:45

我用this regex验证邮件,它工作得很好用电子邮件,包含+

/^(([^<>()[\]\\.,;:\[email protected]\"]+(\.[^<>()[\]\\.,;:\[email protected]\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/ 
+0

这似乎不错,但它允许其他字符这不是假设在电子邮件地址。 – 2017-03-05 13:21:22

+0

@RickSanchez可悲的现实是,正则表达式并不是解析/验证电子邮件地址的正确工具。 – 2017-03-07 15:39:06

保存理智。获取预制的PHP RFC 822Email address parser

+2

如果我能给你十+ 1我会。 – CanSpice 2011-03-31 16:39:44

+0

这是JavaScript的RFC 822 http://badsyntax.co/post/javascript-email-validation-rfc822 – Gavin 2016-01-29 03:31:18

\+将匹配文字+符号,但请注意:根据RFC规范,您仍然不会匹配所有可能的电子邮件地址,因为the actual regex for that is madness。这几乎肯定不值得;你应该使用真正的电子邮件解析器。

这是另一种解决方案(类似于大卫找到了解决方法):

//Escaped for .Net 
^[_a-zA-Z0-9-]+((\\.[_a-zA-Z0-9-]+)*|(\\+[_a-zA-Z0-9-]+)*)*@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*(\\.[a-zA-Z]{2,4})$ 

//Native 
^[_a-zA-Z0-9-]+((\.[_a-zA-Z0-9-]+)*|(\+[_a-zA-Z0-9-]+)*)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,4})$