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

问题描述 投票:7回答:6

正则表达式让我震惊。如何更改此设置以验证带有加号的电子邮件?因此我可以通过[email protected]进行注册

if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/i", $_GET['em'])) {
php regex preg-match
6个回答
34
投票

似乎您并不真正了解您的正则表达式当前正在做什么,这是修改它之前的一个很好的第一步。让我们使用电子邮件地址[email protected]遍历您的正则表达式(在下面的每个部分中,粗体部分是该部分所匹配的部分):

  1. ^start of string anchor。它指定任何匹配项必须从开始串。如果图案不是锚,正则表达式引擎可以匹配一个子串,通常不希望的。

    锚点为零宽度,这意味着他们不捕获任何字符。

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

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

    (捕获john[email protected]

  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 @ mail。com)

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

  7. $是字符串锚点的结尾。它与上面的^相同,除了匹配字符串的结尾。


考虑到这一点,如何添加带有捕获段的节应该更清晰一些。正如我们在上面看到的,+是一个特殊字符,因此必须转义。然后,由于必须在+后面加上一些字符,因此我们可以定义一个具有要匹配字符的字符类,并定义其重复字符。最后,我们应该使整个组都是可选的,因为电子邮件地址不需要带有+句段:

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

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

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

8
投票

保存您的理智。获取预制的PHPRFC 822Email address parser


1
投票

我已经使用this regex来验证电子邮件,并且对于包含a +的电子邮件也可以正常工作:

/^(([^<>()[\]\\.,;:\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,}))$/

1
投票

\+将匹配一个文字+号,但要注意:根据[RFC],您仍将接近匹配所有可能的电子邮件地址,因为the actual regex for that is madness。几乎肯定是不值得的。您应该为此使用真正的电子邮件解析器。


0
投票

这是另一个解决方案(类似于David找到的解决方案:]

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

0
投票

这是另一个解决方案

/^[_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]+)$/

© www.soinside.com 2019 - 2024. All rights reserved.