You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含特殊字符/括号的手机号掩码处理:JS代码问题求助

手机号掩码功能的正确JS实现方案

需求梳理

核心实现逻辑需覆盖:

  • 过滤所有非数字字符(空格、特殊符号等),仅保留纯数字
  • 若数字长度超过10位,只保留最后10位
  • 最终格式固定为 xxx-xxx-XXXX,即前6位替换为xxx-xxx-,保留最后4位

正确实现代码

function maskPhoneNumber(phone) {
  // 提取输入中的所有数字字符
  const pureDigits = phone.replace(/\D/g, '');
  // 截取最后10位(长度不足10位时返回原字符串)
  const targetDigits = pureDigits.slice(-10);
  // 替换前6位为掩码格式,保留最后4位
  return targetDigits.replace(/^.{6}/, 'xxx-xxx-');
}

代码解释

  1. 提取纯数字:用正则/\D/g匹配所有非数字字符并替换为空,得到仅含数字的字符串。
  2. 截断超长数字:通过slice(-10)直接截取字符串最后10位,长度不足10位时返回全部内容。
  3. 生成掩码格式:用正则^.{6}匹配前6个字符,替换为xxx-xxx-,保留原字符串最后4位。

测试验证

以下测试用例均符合预期结果:

console.log(maskPhoneNumber("+1-555-555-1234")); // 输出: xxx-xxx-1234
console.log(maskPhoneNumber("1(800)555-0199")); // 输出: xxx-xxx-0199
console.log(maskPhoneNumber("555 555 1234")); // 输出: xxx-xxx-1234
console.log(maskPhoneNumber("9898871234567")); // 输出: xxx-xxx-4567
console.log(maskPhoneNumber("9898871234567)")); // 输出: xxx-xxx-4567

原代码问题分析

你之前使用的var lastphdigit = phone.replace(/\d{3}(?!\d?$)/g, 'xxx-');存在两个核心问题:

  • 未处理非数字字符,输入中的空格、符号会被保留,导致掩码逻辑混乱
  • 未对超长数字进行截断,长度超过10位时会错误地对所有数字分组替换,无法得到固定格式的掩码结果

内容的提问来源于stack exchange,提问作者Karan Nayyar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:38:09