PHP 实现严格符合 RFC 标准的电子邮件地址校验函数

拾柒
拾柒
发布时间:2026-10-14 | 1人浏览过
原创

在 Web 开发中,简单的正则往往无法覆盖电子邮件地址的所有合法字符组合。本文将提供一个基于 RFC 标准构建的 PHP 验证函数,通过拆解 local-part、域名及特殊转义字符,使用 preg_match 实现高精度的邮箱格式校验。

实现目标

默认的简单邮箱验证通常仅检查是否存在 @ 符号及基本域名结构,但合法的电子邮件地址可能包含引号字符串、带空格的点号或复杂的本地部分。本方案旨在提供一个能够识别更广泛合法格式的底层验证逻辑。

核心参数与规则

该函数的核心在于构建符合 RFC 5321/5322 规范的正则表达式字符串。主要组成部分包括:

  • 局部部分 (Local Part):允许原子字符序列或由双引号包围的引号字符串。
  • 域名 (Domain):由子域名组成,子域名可以是原子字符或方括号包围的字面量。
  • 特殊字符处理:定义了转义对 ($quoted_pair) 以处理反斜杠后的特殊 ASCII 码。

具体操作

第1步:定义基础字符类

首先,我们需要界定非转义字符的范围。对于不包含特定控制字符的路径,分别定义 $qtext 和 $dtext。

$qtext = '[^\x0d\x22\x5c\x80-\xff]';
$dtext = '[^\x0d\x5b-\x5d\x80-\xff]';

第2步:构建原子与字面量模块

定义基本的不可分割单元 $atom,以及由方括号包裹的字面量 $domain_literal 和由双引号包裹的 $quoted_string。同时定义转义序列 $quoted_pair。

$atom = '[^\x00-\x20\x22\x28\x29\x2c\x2e\x3a-\x3c'.
'\x3e\x40\x5b-\x5d\x7f-\xff]+';
$quoted_pair = '\x5c[\x00-\x7f]';
$domain_literal = "\x5b($dtext|$quoted_pair)*\x5d";
$quoted_string = "\x22($qtext|$quoted_pair)*\x22";

第3步:组合域名与本地部分

将上述模块组合成完整的域名结构 $domain,并定义本地部分 $local_part。最终拼接为全局地址规格 $addr_spec。

$domain_ref = $atom;
$sub_domain = "($domain_ref|$domain_literal)";
$word = "($atom|$quoted_string)";
$domain = "$sub_domain(\x2e$sub_domain)*";
$local_part = "$word(\x2e$word)*";
$addr_spec = "$local_part\x40$domain";

第4步:封装验证函数

使用 preg_match 执行最终匹配。若匹配成功返回 1,否则返回 0。

function is_valid_email_address($email){
    // ... (此处省略上述变量定义代码)
    return preg_match("!^$addr_spec$!", $email) ? 1 : 0;
}

完成判断

调用该函数后,如果返回值为 1,表示输入的字符串符合严格的 RFC 邮箱格式规范;返回 0 则表示格式不合法。需要注意的是,此函数仅验证语法格式,并不验证邮件地址是否真实存在或能否接收邮件。

简要总结

以上就是基于复杂正则表达式在 PHP 中检查电子邮件函数的详细内容,更多关于 PHP 数据验证的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表