在顯示用戶手機號碼或電話號碼時,為保護隱私,常需將中間幾位數字以星號遮罩。本文提供兩種 PHP 實作方式,分別適用於手機號碼與市話號碼的遮罩需求。
此函數可同時處理手機號碼與市話號碼,自動判斷格式並替換中間數字。
function hidtel($phone) {
// 判斷是否為市話格式:02-12345678 或 037-1234567
$isLandline = preg_match('/(0[0-9]{2,3}[-]?[2-9][0-9]{6,7}[-]?[0-9]?)/i', $phone);
if ($isLandline) {
// 市話:保留區碼與前幾碼,中間 3-4 碼替換為 ****
return preg_replace('/(0[0-9]{2,3}[-]?[2-9])[0-9]{3,4}([0-9]{3}[-]?[0-9]?)/i', '$1****$2', $phone);
} else {
// 手機:保留前 3 碼與後 4 碼,中間 4 碼替換為 ****
return preg_replace('/(1[358]{1}[0-9])[0-9]{4}([0-9]{4})/i', '$1****$2', $phone);
}
}
若確定僅處理 11 碼手機號碼,可使用 substr_replace 直接替換,效能較佳。
$num = "13966778888";
$str = substr_replace($num, '****', 3, 4); // 從第 4 碼開始替換 4 個字元
// 結果:139****8888
<?php
$phonenum = "13966778888";
echo hidtel($phonenum); // 輸出:139****8888
?>
| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 正則版 | 支援市話與手機混合、格式彈性 | 效能稍低、正則較複雜 | 後台管理、資料匯出、格式不固定輸入 |
| substr_replace | 程式碼簡潔、執行速度快 | 僅限固定長度手機號碼 | 前端顯示、API 回傳、高頻呼叫 |
建議根據實際業務需求選擇:若系統需兼容多種電話格式,使用方法一;若專門處理標準 11 碼手機號,方法二更輕量高效。