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

Posted

技术标签:

【中文标题】在正则表达式电子邮件中允许 + 验证电子邮件 [重复]【英文标题】:Allow + in regex email validate email [duplicate] 【发布时间】:2011-07-27 01:39:18 【问题描述】:

正则表达式让我大吃一惊。如何更改此设置以验证带有加号的电子邮件?所以我可以用 test+spam@gmail.com 注册

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

【问题讨论】:

该正则表达式在该电子邮件地址上工作。你试过了吗? 【参考方案1】:

您似乎并不真正熟悉您的正则表达式当前正在做什么,这将是修改它之前的一个很好的第一步。让我们使用电子邮件地址john.robert.smith@mail.com 浏览您的正则表达式(在下面的每个部分中,粗体部分是该部分匹配的内容):

    ^ 是start of string anchor。 它指定任何匹配必须 从开头开始 细绳。如果图案不是 锚定,正则表达式引擎可以匹配 一个子串,通常是 不受欢迎。

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

    [_a-z0-9-]+ 由两个组成 元素,一个character class 和repetition modifer:

    [...] 定义了一个字符类,它告诉正则表达式引擎, 这些字符中的任何一个都是有效的匹配项。在这种情况下,类 包含字符 a-z、数字 0-9 以及破折号和下划线(在 一般,字符类中的破折号 定义一个范围,所以你可以使用 a-z 而不是 abcdefghijklmnopqrstuvwxyz;什么时候 作为最后一个字符给出 类,它充当文字破折号)。 + 是一个重复修饰符,它指定前面的标记 (在这种情况下,字符类) 可以重复一次或多次。 还有两个重复 运算符:* 匹配零个或多个 次; ? 完全匹配零或 一次(即做某事 可选)。

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

    (\.[_a-z0-9-]+)* 再次包含一个 重复的字符类。它也是 包含一个 group, 和一个转义字符:

    (...) 定义了一个组,它允许您对多个令牌进行分组 一起(在这种情况下,组 将被重复为 整个)。假设我们想要 匹配'abc',零次或多次(即。 abcabcabc 匹配,abcccc 不匹配)。 如果我们尝试使用该模式 abc*,重复修饰符 仅适用于c,因为 c 是之前的最后一个标记 修饰符。为了四处走动 这个,我们可以分组 abc ((abc)*), 在这种情况下,修饰符将 适用于整个组,就好像它 是一个单一的令牌。 \. 指定文字点字符。需要这个的原因 是因为. 是一个特殊的 正则表达式中的字符,表示any character。 因为我们想匹配一个实际的点 字符,我们需要转义它。

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

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

    [a-z0-9-]+ 再次定义了一个重复的字符类,如上面的第 2 项。 (捕获 john.robert.smith@mail.com)

    (\.[a-z0-9-]+)* 与上面的#3 几乎完全相同。 (捕获 john.robert.smith@mail.com

    $ 是字符串锚的结尾。它的工作原理与上面的^ 相同,除了匹配字符串的结尾。


考虑到这一点,应该更清楚如何添加带有捕获加号段的部分。正如我们在上面看到的,+ 是一个特殊字符,因此必须对其进行转义。然后,由于 + 后面必须跟一些字符,我们可以用我们想要匹配的字符定义一个字符类并定义它的重复。最后,我们应该将整个组设为可选,因为电子邮件地址不需要有 + 段:

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

当插入你的正则表达式时,它看起来像这样:

/^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)?@[a-z0-9-]+(\.[a-z0-9-]+)*$/i

【讨论】:

保留\.也?它不应该在 [] 我当前的正则表达式显示 (\.[_a-z0-9-]+),我会得到它 (\+\.[_a-z0-9-]+ 吗? 啊,所以 * 表示该模式重复 0 次或多次? 正确,* 表示零次或多次重复。 ? 表示零次或一次重复。 这是一个很棒的解释! +1【参考方案2】:

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

【讨论】:

如果我能给你十个 +1 我会的。 这里是 RFC 822 for javascript badsyntax.co/post/javascript-email-validation-rfc822【参考方案3】:

我使用this regex 来验证电子邮件,它适用于包含+ 的电子邮件:

/^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[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,))$/

【讨论】:

这看起来不错,但它允许其他不应该在电子邮件地址中的字符。 @RickSanchez 可悲的现实是,正则表达式不是完整解析/验证电子邮件地址的正确工具。【参考方案4】:

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

【讨论】:

【参考方案5】:

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

//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)$

【讨论】:

【参考方案6】:

这是另一种解决方案

/^[_a-z0-9-+]+(\.[_a-z0-9-+]+)*(\+[a-z0-9-]+)?@[a-z0-9-.]+(\.[a-z0-9]+)$/

or For razor page(@=\u0040)

/^[_a-z0-9-+]+(\.[_a-z0-9-+]+)*(\+[a-z0-9-]+)?\u0040[a-z0-9-.]+(\.[a-z0-9]+)$/

【讨论】:

以上是关于在正则表达式电子邮件中允许 + 验证电子邮件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 symfony2 验证器中允许空值

在 MVC 输入中允许特定格式的电子邮件地址

在 MVC 正则表达式中允许一些但不是所有的空格

如何在我的谷歌脚本中允许 CORS 请求?

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

在 PHP 中使用正则表达式进行电子邮件验证