如何实现多格式电话号码转E.164格式(支持多欧洲国家)
多格式欧洲电话号码格式化需求
我通过在线表单获取多种格式的电话号码,示例如下:
0123456789 +49 123456789 +49123456789 00123456789 0049 123456789
目前仅处理德国号码,使用的PHP正则格式化代码如下:
$phonenumber = "\+49".preg_replace(array('/^(?:00490?|0490?|\+490?|0)?/','/\D/'),array('',''),$phonenumber);
现在需要新增支持其他欧洲国家,需提取“+”或“00”后的两位国家代码。尝试过正则表达式^\+(\d){2},但会连加号一起选中。了解Google libphonenumber库,但目前仅需处理两位国家代码的号码,觉得该库过于冗余。请问最佳实现方式是什么?
解决方案
可以通过两步正则处理实现需求,既精准提取国家代码,又完成号码格式化:
具体PHP代码实现
// 1. 提取两位国家代码:匹配+XX或00XX开头的情况,本地号码默认用德国代码49 preg_match('/^(?:\+(\d{2})|00(\d{2}))/', $phonenumber, $matches); $countryCode = !empty($matches[1]) ? $matches[1] : (!empty($matches[2]) ? $matches[2] : '49'); // 2. 清理号码:移除所有前缀(含0、00XX、+XX等)和非数字字符 $cleanNumber = preg_replace(array( '/^(?:00\d{2}0?|0\d{2}0?|\+\d{2}0?|0)?/', '/\D/' ), '', $phonenumber); // 3. 拼接标准格式号码 $formattedNumber = "+{$countryCode}{$cleanNumber}";
代码说明
- 正则
/^(?:\+(\d{2})|00(\d{2}))/:用两个捕获组分别提取+后或00后的两位国家代码,避免选中前缀符号 - 本地号码(无+或00前缀)默认使用德国代码
49,可根据实际需求修改默认值 - 清理步骤先移除各类冗余前缀,再清除所有非数字字符,保证号码主体干净
- 最终生成
+XXYYYYYYYYY的标准国际号码格式
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

