正则表达式让我震惊。如何更改此设置以验证带有加号的电子邮件?因此我可以通过[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:
[...]
定义一个字符类,它告诉正则表达式引擎,这些字符中的任何一个都是有效的匹配项。在这种情况下包含字母a-z,数字0-9和破折号和下划线(在一般,字符类中的破折号定义范围,因此您可以使用a-z
代替abcdefghijklmnopqrstuvwxyz
;什么时候作为最后一个字符类,它充当文字破折号)。+
是一个重复修饰符,它指定前面的标记(在这种情况下,字符类)可以重复一次或多次。还有另外两个重复运算符:*
匹配零个或多个时代?
精确匹配零或一次(即做某事可选)。(捕获john。[email protected])
(\.[_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
保存您的理智。获取预制的PHPRFC 822Email address parser
我已经使用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,}))$/
\+
将匹配一个文字+号,但要注意:根据[RFC],您仍将接近匹配所有可能的电子邮件地址,因为the actual regex for that is madness。几乎肯定是不值得的。您应该为此使用真正的电子邮件解析器。
这是另一个解决方案(类似于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})$
这是另一个解决方案
/^[_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]+)$/