修改regex以验证电子邮件


Modify regex to validate email?

preg_match("/^[-'w.]+@([A-z0-9][-A-z0-9]+'.)+[A-z]{2,4}$/", $email);

我想修改这个正则表达式,以允许电子邮件,如user+one@wherever.com

我该怎么做?

只需将+添加到[-'w.]部分:

preg_match("/^[-'w.+]+@([A-z0-9][-A-z0-9]+'.)+[A-z]{2,4}$/", $email);

请注意,过滤器扩展有一个可以正确验证电子邮件地址的电子邮件验证器:

if (filter_var($email, FILTER_VALIDATE_EMAIL) === false) {
    // invalid
}

看到filter_var <一口>[医生]FILTER_VALIDATE_EMAIL <一口>[医生]过滤器。

供参考,这里是FILTER_VALIDATE_EMAIL使用的正则表达式:

/^(?!(?:(?:''x22?''x5C[''x00-''x7E]''x22?)|(?:''x22?[^''x5C''x22]''x22?)){255,})
(?!(?:(?:''x22?''x5C[''x00-''x7E]''x22?)|(?:''x22?[^''x5C''x22]''x22?)){65,}@)(?
:(?:[''x21''x23-''x27''x2A''x2B''x2D''x2F-''x39''x3D''x3F''x5E-''x7E]+)|(?:''x22
(?:[''x01-''x08''x0B''x0C''x0E-''x1F''x21''x23-''x5B''x5D-''x7F]|(?:''x5C[''x00-
''x7F]))*''x22))(?:''.(?:(?:[''x21''x23-''x27''x2A''x2B''x2D''x2F-''x39''x3D''x3
F''x5E-''x7E]+)|(?:''x22(?:[''x01-''x08''x0B''x0C''x0E-''x1F''x21''x23-''x5B''x5
D-''x7F]|(?:''x5C[''x00-''x7F]))*''x22)))*@(?:(?:(?!.*[^.]{64,})(?:(?:(?:xn--)?[
a-z0-9]+(?:-[a-z0-9]+)*''.){1,126}){1,}(?:(?:[a-z][a-z0-9]*)|(?:(?:xn--)[a-z0-9]
+))(?:-[a-z0-9]+)*)|(?:''[(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){7})|(
?:(?!(?:.*[a-f0-9][:'']]){7,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?::(?:[a-f
0-9]{1,4}(?::[a-f0-9]{1,4}){0,5})?)))|(?:(?:IPv6:(?:(?:[a-f0-9]{1,4}(?::[a-f0-9]
{1,4}){5}:)|(?:(?!(?:.*[a-f0-9]:){5,})(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3})?:
:(?:[a-f0-9]{1,4}(?::[a-f0-9]{1,4}){0,3}:)?)))?(?:(?:25[0-5])|(?:2[0-4][0-9])|(?
:1[0-9]{2})|(?:[1-9]?[0-9]))(?:''.(?:(?:25[0-5])|(?:2[0-4][0-9])|(?:1[0-9]{2})|(
?:[1-9]?[0-9]))){3}))'']))$/iD

+添加到第一个字符集:

preg_match("/^[-'w.+]+@([A-z0-9][-A-z0-9]+'.)+[A-z]{2,4}$/", $email);

只是为了指出前面的答案的一个问题:'+'和'。'不能是电子邮件地址用户名部分的第一个字符。正确的正则表达式应该是

preg_match("/^'w[-'w.+]*@([A-z0-9][-A-z0-9]+'.)+[A-z]{2,4}$/", $email);
请注意,为了验证完整的RFC 2822,您需要这样做:
preg_match('/(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:'.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:['x01-'x08'x0b'x0c'x0e-'x1f'x21'x23-'x5b'x5d-'x7f]|''['x01-'x09'x0b'x0c'x0e-'x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?'.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|'[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)'.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:['x01-'x08'x0b'x0c'x0e-'x1f'x21-'x5a'x53-'x7f]|''['x01-'x09'x0b'x0c'x0e-'x7f])+)'])/', $email);

然而,这对于大多数应用来说不是很实用。关于电子邮件地址的正则表达式验证的详细讨论,请查看此页。