你如何规范化PHP中的电子邮件地址?

时间:2009-07-23 00:08:49

标签: php email

PHP中是否有可以规范化电子邮件地址的功能?

例如,如果案件不重要,那么FOO@example.com - > foo@example.com

我不知道电子邮件地址应该被视为“相同”的规则,所以我不想自己实现。

7 个答案:

答案 0 :(得分:10)

维基百科对各种RFC如何形成email address的说法进行了总结。

尽管其他人已经说过,但电子邮件可以区分大小写

  

本地部分区分大小写,因此“jsmith@example.com”和“JSmith@example.com”可能会传递给不同的人。 RFC 5321不鼓励这种做法。但是,只有域的权威邮件服务器才能做出决定。唯一的例外是“postmaster”的本地部分值,它不区分大小写,应该转发给服务器的管理员。

本地部分指的是@符号左侧地址的一部分。

因此,就您的具体问题(案例规范化)而言,您可以小写服务器部分(在@的右侧)但是您最合适(由@,strToLower拆分服务器组件,重新组合)。

答案 1 :(得分:3)

使用strtolower()将服务器部分设为小写。 (由于之前的回答而更新)

$parts = explode("@", $email);
$host = strtolower($parts[1]);
$email = $parts[0]."@".$host;

此外,如果您想要标准化格式,您可能还需要查看filter_var(),它可以对电子邮件地址进行整理/验证,以及其他几种格式。

首先,FILTER_SANITIZE_EMAIL将确保其中没有非法字符。

$email_sanatized = filter_var('bob@example.com', FILTER_SANITIZE_EMAIL);

然后,FILTER_VALIDATE_EMAIL将确保其采用有效的电子邮件格式

$email = filter_var($email_sanatized, FILTER_VALIDATE_EMAIL);

答案 2 :(得分:3)

如果需要,可以使用strtolower(),它可以正确覆盖您的大部分电子邮件。但是如果你想正确地做这件事,还有一些额外的信息:

电子邮件地址由两部分组成:本地部分(@之前的任何内容)和域(@之后的任何内容)。本地部分应由域部分中给出的域的邮件服务器进行解释,因此您实际上无法对此进行任何假设(例如,情况很重要!)。

许多邮件服务器提供adding arbitrary comments to your user name with a plus sign选项,如下所示:

soulmerge+this_mail_is_delivered_to_the_user_soulmerge@example.com

对于一个邮件服务器soulmerge@example.comsoulmerge+friends@example.comSOULMERGE@example.com可能是同一个邮箱,而在另一个邮件服务器中它可能指向两个或三个不同的邮箱,但事实是:你不能知道。您在整个地址上进行的任何翻译都可能导致地址无效。

答案 3 :(得分:2)

这只是其他答案的补充。

在gmail的情况下,我会删除左侧的点。

  

Gmail只允许对任何指定用户名进行一次注册。注册用户名后,其他人无法注册相同的用户名,无论其是否包含额外的句点或大写字母;那些用户名属于你。如果您创建了yourusername@gmail.com,则无法注册your.username@gmail.com或Your.user.name@gmail.com。由于Gmail无法将点识别为用户名中的字符,因此您可以在不更改实际目标地址的情况下在Gmail地址中添加或删除这些点;他们都会进入你的收件箱,只有你自己。

因此您可以确定您始终拥有相同的Gmail电子邮件。

答案 4 :(得分:1)

修剪所有空格,然后与strtolower进行比较。那应该没问题。

答案 5 :(得分:-1)

如果您正在寻找小号:strtolower()

答案 6 :(得分:-1)

编辑:基于另一个答案,该状态仅表明域不区分大小写我已将该功能更新为仅小写域而不是用户。

function NormalizeEmail( $email )
{
    list( $user, $domain ) = explode( '@', trim( $email ) );
    return $user . '@' . strtolower( $domain );
}