
本文介绍一种可靠、简洁的 PHP 方法,通过正则表达式清洗并标准化电话号码,支持处理含符号(如 -)、空格或已部分格式化的输入,最终统一输出为 (555) 555-5555 格式。
本文介绍一种可靠、简洁的 php 方法,通过正则表达式清洗并标准化电话号码,支持处理含符号(如 `-`)、空格或已部分格式化的输入,最终统一输出为 `(555) 555-5555` 格式。
在实际 Web 开发中,用户输入的电话号码格式千差万别:可能是 5555555555、555-555-5555、(555) 555.5555,甚至已部分格式化为 (555) 555-5555。为保证数据一致性与前端展示规范,我们需要一个健壮的格式化函数——先清洗,再重组。
核心思路分两步:
-
提取纯数字:使用
preg_replace('/[^0-9]/', '', $number)移除所有非数字字符(如-、(、)、.、空格等); -
按模式重组:对清洗后的 10 位数字字符串,用
preg_replace('/([0-9]{3})([0-9]{3})([0-9]{4})/', '($1) $2-$3', $numberOnly)精准匹配并插入括号与连字符。
以下是完整可复用的函数示例:
function formatPhoneNumber($number): string {
// 安全过滤:空值或非字符串输入直接返回空
if (empty($number) || !is_string($number)) {
return '';
}
// 步骤1:提取纯数字(仅保留 0–9)
$numberOnly = preg_replace('/[^0-9]/', '', $number);
// 步骤2:验证是否为 10 位有效号码
if (strlen($numberOnly) !== 10) {
return $number; // 或抛出异常/记录日志,根据业务需求决定
}
// 步骤3:格式化为 (555) 555-5555
return preg_replace('/^([0-9]{3})([0-9]{3})([0-9]{4})$/', '($1) $2-$3', $numberOnly);
}
// 使用示例
var_dump(formatPhoneNumber('5555555555')); // → "(555) 555-5555"
var_dump(formatPhoneNumber('555-555-5555')); // → "(555) 555-5555"
var_dump(formatPhoneNumber('(555) 555.5555')); // → "(555) 555-5555"
var_dump(formatPhoneNumber('(555) 555-5555')); // → "(555) 555-5555"(保持不变)
✅ 注意事项:
- 该方案不进行区号或号码有效性校验(如 NXX 规则),仅做格式标准化;如需严格验证,建议结合 libphonenumber 等专业库;
- 正则中使用
^和$锚点确保精确匹配 10 位,避免误处理更长或更短字符串; - 若需支持国际号码(如 +1-555-555-5555),应先识别国家代码并单独处理,本例聚焦北美 10 位本地号码场景。
此方法简洁高效、无外部依赖,适用于表单提交、数据库写入前的标准化处理,是 PHP 项目中电话格式化的推荐实践。











