PHP手机号格式化函数修复:移除区号后多余前导零
我仔细看了你的手机号格式化代码和测试结果,发现问题出在处理区号后紧跟的前导零时,正则表达式没有正确移除这些多余的零。下面是修复后的完整方案:
问题分析
你遇到的核心问题是:当手机号以+区号0或00区号0开头时,原代码仅匹配并保留了区号后的前导零,没有实现“移除区号后所有前导零”的需求,导致最终结果不符合[国际区号][无前导零手机号]的格式要求。
修复后的代码
<?php function formatMobileNumberWithDialingCode($mobileNo, $defaultDialingCode = '') { $validDialingCodes = [357, 385, 371]; // 处理带+或00前缀的手机号 if (preg_match('/^(\+|00)/', $mobileNo)) { // 先统一移除+或00前缀 $tempMobileNo = preg_replace('/^(\+|00)/', '', $mobileNo); foreach ($validDialingCodes as $dialingCode) { // 匹配"区号+任意数量前导零+手机号",移除区号后的所有前导零 $pattern = '/^(' . preg_quote($dialingCode, '/') . ')0*(.*)/'; if (preg_match($pattern, $tempMobileNo)) { $tempMobileNo = preg_replace($pattern, '$1$2', $tempMobileNo); break; } } return $tempMobileNo; } // 处理不带前缀的手机号 $convertedMobileNo = '00' . $defaultDialingCode . $mobileNo; foreach ($validDialingCodes as $dialingCode) { $pattern = '/^(' . preg_quote($dialingCode, '/') . ')0*(.*)/'; if (preg_match($pattern, $mobileNo)) { // 匹配"区号+任意数量前导零+手机号",移除前导零后补00前缀 $convertedMobileNo = preg_replace($pattern, '00$1$2', $mobileNo); break; } } // 最后统一清理可能残留的前缀 return preg_replace('/^(\+|00)/', '', $convertedMobileNo); } // 测试用例 $mobileNoSamples = [ '385' => [ '441234568', '+371441234568', '+3850441234568', '00385441234568' ], '371' => [ '551234567', '+385551234567', '+3710551234567', '00371551234567' ] ]; foreach ($mobileNoSamples as $dialingCode => $mobileNos) { foreach ($mobileNos as $mobileNo) { echo '(' . $dialingCode . ') ' . $mobileNo . ' -> ' . formatMobileNumberWithDialingCode($mobileNo, $dialingCode) . PHP_EOL; } }
关键修改说明
- 正则逻辑优化:将原代码中匹配
(0+)?的逻辑改为0*,可以匹配任意数量的前导零(包括零个),替换时直接丢弃这些零,只保留区号和有效手机号部分。 - 添加
preg_quote:对区号进行正则转义,避免后续如果区号包含特殊字符(当前都是数字,但养成规范习惯)导致匹配出错。 - 简化前缀处理:移除
+或00前缀时,直接用preg_replace('/^(\+|00)/', '', $mobileNo),比原代码的分组替换更简洁清晰。
验证结果
执行修复后的代码,输出将全部符合预期:
(385) 441234568 -> 385441234568 [正确] (385) +371441234568 -> 371441234568 [正确] (385) +3850441234568 -> 385441234568 [正确] (385) 00385441234568 -> 385441234568 [正确] (371) 551234567 -> 371551234567 [正确] (371) +385551234567 -> 385551234567 [正确] (371) +3710551234567 -> 371551234567 [正确] (371) 00371551234567 -> 371551234567 [正确]
内容的提问来源于stack exchange,提问作者MagePsycho
相关产品推荐
相关产品推荐

