【发布时间】:2016-09-29 15:14:48
【问题描述】:
我有一个用于通过 PHP 发送电子邮件的表单。 现在我有一个用户说电子邮件没有通过。我检查了一下,似乎只有一个名称保存在电子邮件地址的字段中,而不是电子邮件地址。
所以我通过正则表达式添加了一个客户端验证,它只允许您在电子邮件的格式为 [text]@[text].[text] 时发送 - 验证电子邮件地址的常见做法。
使用的正则表达式:
var regex = /\S+@\S+\.\S+/;
你猜怎么着?问题依旧:用户可以发邮件,地址通过验证,但只保存了一个名字!
但是怎么做呢?
用户从 Outlook 复制了电子邮件地址,格式如下:
Mustermann, Max <Max.Mustermann@gmail.com>
正则表达式验证表明:这是一个有效的电子邮件地址。
起初我认为我必须更改我的正则表达式,以不允许这样做。但是我的一位同事说这是电子邮件地址的有效格式。
所以我开始研究 PHP 对那个字符串的实际作用。这里变得奇怪了:
$email = "Mustermann, Max <Max.Mustermann@gmail.com>";
var_dump($email);
// prints out:
// string(42) "Mustermann, Max "
字符串停在<,但它的长度仍然是42。这里到底发生了什么?
编辑:
故事结束:我现在使用更严格的正则表达式来验证电子邮件地址,即 HTML5 input type="email" from W3C 使用的相同:
/^[a-zA-Z0-9.!#$%&’*+/=?^_`{|}~-]+@[a-zA-Z0-9-]+(?:\.[a-zA-Z0-9-]+)*$/
【问题讨论】: