在正则表达式电子邮件中允许 + 验证电子邮件 [重复]
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]+)$/
【讨论】:
以上是关于在正则表达式电子邮件中允许 + 验证电子邮件 [重复]的主要内容,如果未能解决你的问题,请参考以下文章