用substr对手机号打码需拼接前3位+“**”+后4位;基础写法为substr($phone,0,3).'****'.substr($phone,-4);推荐加is_string、strlen、ctype_digit校验;含符号时先preg_replace清理数字再处理。

<p>用 <strong>substr</strong> 对手机号中间四位打码(如 138****1234),关键在于截取前3位 + "****" + 后4位。</p> <H3>基础写法(假设手机号是11位字符串)</H3> <p>PHP 7.4 中直接使用 <strong>substr</strong> 即可,无需额外函数:</p> <font color="blue"> <pre class="brush:php;toolbar:false;"> $phone = '13812345678'; $masked = substr($phone, 0, 3) . '****' . substr($phone, -4); // 结果:138****5678
加安全判断(推荐实际项目中使用)
防止非11位或非数字字符串出错,建议先校验:
- 用 is_string 和 strlen 判断长度是否为11
- 用 ctype_digit 或正则确保全是数字
- 不符合条件可返回原值或空字符串
function maskPhone($phone) {
if (!is_string($phone) || strlen($phone) !== 11 || !ctype_digit($phone)) {
return $phone; // 或 throw new InvalidArgumentException('无效手机号');
}
return substr($phone, 0, 3) . '****' . substr($phone, -4);
}
兼容带符号的手机号(如 +86138... 或 138-1234-5678)
若原始数据含“+”、“-”、“空格”,需先清理:
立即学习“PHP免费学习笔记(深入)”;
- 用 preg_replace('/[^0-9]/', '', $phone) 提取纯数字
- 再判断是否为11位,再截取
$clean = preg_replace('/[^0-9]/', '', $phone);
if (strlen($clean) === 11) {
$masked = substr($clean, 0, 3) . '****' . substr($clean, -4);
}
注意点
substr 的负数起始位置(如 -4)表示从末尾往前数4个字符,PHP 7.4 完全支持,无需担心兼容性。
不要用 substr($phone, 3, 4) 去“替换中间”,那是取值不是打码;打码本质是拼接,不是修改原串。



















