首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

JavaScript 手機號與座機混合驗證:正則分割驗證法與單一正則進階寫法

     編輯:程式設計綜合問答

需求分析

輸入字符串格式:手機號,座機,手機號...,逗號分隔,需逐個驗證格式正確性。

方案一:分割後逐一驗證(推薦:清晰、易維護、易擴展)


function validatePhones(input) {
    if (!input || !input.trim()) return { valid: false, error: '輸入為空' };
    
    const phones = input.split(',').map(s => s.trim()).filter(s => s);
    const results = [];
    
    const mobileRe = /^1[3-9]\d{9}$/; // 簡化版,實際可更嚴格
    const landlineRe = /^0\d{2,3}-?\d{7,8}(-\d{3,4})?$/;
    
    for (const phone of phones) {
        const isMobile = mobileRe.test(phone);
        const isLandline = landlineRe.test(phone);
        results.push({
            phone,
            valid: isMobile || isLandline,
            type: isMobile ? 'mobile' : (isLandline ? 'landline' : 'invalid')
        });
    }
    
    const allValid = results.every(r => r.valid);
    return { valid: allValid, details: results };
}

// 使用
const r = validatePhones("13800138000,010-12345678,13900139000");
console.log(r.valid, r.details);

方案二:單一正則全匹配(進階:理解正則引擎回溯風險)


// 匹配整個字符串:每個子項必須是手機或座機,逗號分隔
const fullRe = /^(?:(?:1[3-9]\d{9})|(?:0\d{2,3}-?\d{7,8}(-\d{3,4})?))(?:,(?:(?:1[3-9]\d{9})|(?:0\d{2,3}-?\d{7,8}(-\d{3,4})?)))*$/;

function validatePhonesSingleRegex(input) {
    return fullRe.test(input);
}

正則細節解析

片段含義
1[3-9]\d{9}手機號:1 開頭,第二位 3-9,共 11 位
0\d{2,3}座機區號:0 開頭,2-3 位數字
-?可選連字符
\d{7,8}本地號碼 7-8 位
(-\d{3,4})?可選分機號
(?:...)非捕獲分組,僅分組不捕獲
*$重複 0 次或多次,直到字符串結尾

性能與安全對比

  • 分割法:O(n) 線性,無回溯風險,易於添加新號碼類型(如 400、95 開頭)
  • 單一正則:極端輸入(如大量逗號、超長字符串)可能觸發災難性回溯(ReDoS),生產環境需謹慎

生產級增強建議

  • 引入 libphonenumber-js 庫,支援國際號碼、運營商識別、格式化
  • 前端即時驗證 + 後端二次驗證(防繞過)
  • 建立號碼段數據庫定期更新(工信部公布最新段)
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved