首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 手機號驗證全攻略:從基礎正則到運營商段號精準匹配

     編輯:PHP 相關知識

PHP 手機號驗證全攻略:從基礎正則到運營商段號精準匹配

中國大陸手機號為 11 位數字,首位固定為 1,第二位為 3-9。但簡單的 /^1\d{10}$/ 會放行「18888888888」這類明顯無效號碼。本文遞進式講解:基礎格式校驗 → 運營商段號白名單 → 綜合驗證函數,並提供可直接落地的代碼。

第一層:基礎格式校驗

僅檢查長度與首位,適合快速原型或非核心業務。

$mobile = '15858588585';
if (!preg_match('/^1[0-9]{10}$/', $mobile)) {
    exit('手機號格式不正確');
}

第二層:主流運營商段號白名單(2024 年常用段)

運營商號段(前三位)
移動134、135、136、137、138、139、147、150、151、152、157、158、159、172、178、182、183、184、187、188、195、197、198
聯通130、131、132、145、155、156、166、167、171、175、176、185、186、196
電信133、149、153、173、174、177、180、181、189、190、191、193、199
廣電192
虛擬運營商170、171、165、167、171 等

第三層:精準正則驗證函數

整理上述號段生成正則,支持新增段號擴展。函數返回布爾值,便於業務邏輯判斷。

function isMobile($str) {
    // 移動、聯通、電信、廣電、虛商主流段號
    $pattern = '/^1(?:3\d|4[5-9]|5[0-35-9]|6[2567]|7[0-8]|8\d|9[0-35-9])\d{8}$/';
    return (bool)preg_match($pattern, $str);
}

// 使用示例
$phones = ['13800138000', '18888888888', '19212345678', '12345678901'];
foreach ($phones as $phone) {
    echo $phone . ' => ' . (isMobile($phone) ? '有效' : '無效') . "\n";
}

進階:識別運營商歸屬

業務場景如發送差異化短信模板、風控分級,需判斷具體運營商。

function getCarrier($mobile) {
    if (!isMobile($mobile)) return 'invalid';
    $prefix = substr($mobile, 0, 3);
    $mobilePrefixes = ['134','135','136','137','138','139','147','150','151','152','157','158','159','172','178','182','183','184','187','188','195','197','198'];
    $unicomPrefixes = ['130','131','132','145','155','156','166','167','171','175','176','185','186','196'];
    $telecomPrefixes = ['133','149','153','173','174','177','180','181','189','190','191','193','199'];
    $broadcastPrefixes = ['192'];
    if (in_array($prefix, $mobilePrefixes)) return 'mobile';
    if (in_array($prefix, $unicomPrefixes)) return 'unicom';
    if (in_array($prefix, $telecomPrefixes)) return 'telecom';
    if (in_array($prefix, $broadcastPrefixes)) return 'broadcast';
    return 'virtual';
}

最佳實踐建議

  1. 前後端雙重驗證: 前端攔截明顯錯誤,後端作為最終防線。
  2. 定期更新號段庫: 工信部每年新增號段,建議每半年同步一次官方公告。
  3. 結合短信驗證碼: 格式驗證只能確認格式,唯有下發短信驗證碼才能確認號碼真實擁有權。
  4. 國際化兼容: 如需支持港澳台/海外號碼,建議引入 libphonenumber 庫而非自寫正則。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved