允许+在正则表达式电子邮件中验证电子邮件
正则表达式正在让我迷失。我怎样才能改变这一点来验证带有加号的电子邮件?所以我可以在申请时[email protected]允许+在正则表达式电子邮件中验证电子邮件
if(!preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*$/i", $_GET['em'])) {
看起来你并不是真正熟悉你的正则表达式正在做什么,这将是修改它之前的一个好的第一步。让我们通过你的正则表达式使用的电子邮件地址[email protected]
(以下每个部分,粗体的部分就是由部分匹配)走:
-
^
是start of string anchor。 它指定任何匹配必须 开始在 字符串的开头。如果锚图案不是 ,那么正则表达式引擎可以匹配 子字符串,这通常是不期望的 。锚点是零宽度,这意味着它们不会捕获任何字符。
-
[_a-z0-9-]+
由两个 元件,一个character class 和repetition modifer:-
[...]
定义一个字符类,它告诉正则表达式引擎, 这些字符任何有效匹配。在这种情况下,类 包含字符az,数字 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 @邮件 .COM)(\.[a-z0-9-]+)*
几乎完全相同的图案与上述#3。
(捕获[email protected] .COM)$
是串锚固件的端部。它与上面的^
的工作方式相同,只是匹配字符串的末尾。
考虑到这一点,它应该是更清楚一点如何添加栏目,捕捉一个加号段。正如我们上面看到的,+
是一个特殊字符,所以它必须被转义。然后,由于+必须跟随一些字符,我们可以用我们想要匹配的字符来定义一个字符类并定义它的重复。最后,我们应该让全组可选的,因为电子邮件地址并不需要有一个+段:
(\+[a-z0-9-]+)?
当插入您的正则表达式,它会是这样的:
/^[_a-z0-9-]+(\.[_a-z0-9-]+)*(\+[a-z0-9-]+)[email protected][a-z0-9-]+(\.[a-z0-9-]+)*$/i
我用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,}))$/
这似乎不错,但它允许其他字符这不是假设在电子邮件地址。 – 2017-03-05 13:21:22
@RickSanchez可悲的现实是,正则表达式并不是解析/验证电子邮件地址的正确工具。 – 2017-03-07 15:39:06
\+
将匹配文字+符号,但请注意:根据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})$
该正则表达式对电子邮件地址的工作。你试过了吗? – Jeff 2011-03-31 16:38:24
可能重复的[如何验证电子邮件在PHP?](http://*.com/questions/5855811/how-to-validate-an-email-in-php) – kapa 2014-06-10 22:20:43