格式化电话号码

时间:2009-10-06 10:47:42

标签: php formatting

对于一个体面和标准化的php函数,我想将用户输入的字符串格式化为std。国际电话号码格式。 该字符串将从其他字符中删除为数字和+ -signs。所有空格都将被删除。 之后我想将不同的字符串格式化为标准化形式:

+310612345678  -> +31 (0)61 234 5678
00310612345678  -> +31 (0)61 234 5678

+31612345678   -> +31 (0)61 234 5678 
//add a leading zero between brackets (0))
0031612345678  -> +31 (0)61 234 5678

06 12345678   -> +31 (0)61 234 5678 
//When no country code is given (no 00xx or +xx) than add the dutch one.

这是我已经完成的功能:

function formatPhoneNumber($num){
 //delete everything except digits and +
  $number = preg_replace('/[^\d|\+]/', '', $number);

 if(substr($number,0,1) == '+' || substr($number, 0,2) == 00){
  //
 }else{
  $number = "+31".$number;
 }

 /////////
 // formatting as mentioned above
 /////////


 return $num
}

我正在寻找一种算法,将用户输入的电话号码的不同方式格式化为一种格式:+31(0)61 2345678

4 个答案:

答案 0 :(得分:3)

除了为国家/地区代码添加前缀之外,我不确定是否真的有国际标准。有关国际电话号码格式的示例,请参阅here。格式化将根据国家和类型而变化。

e.g。在英国,我们的固定电话为+44(0)20 1234 1234,手机为+44(0)7700 123456。

因此,如果您想要正确执行此操作,我认为您需要识别国家/地区代码,然后插入特定于国家/地区的格式化程序。

答案 1 :(得分:3)

目前我还没有最终解决方案,但如果你不想只分析荷兰数字,我想指出一些困难:

  • 你必须知道所有的国际前缀(有些是一位数,如北美1 + 1,有些是两位数,像荷兰语+31,有些是三位数,如捷克语+420)如果国家代码和区号之间没有空格,则无法简单地确定格式中空格的正确位置。

  • 此外,您无法自动假设区号中的前导零是多余的。在像意大利这样的一些国家,即使在国际电话中,也必须使用领先的零,i。即如果你想从荷兰打电话给米兰号02 123456,你必须拨打+39 02 123456而不是+39 2 123456。

因此,它不仅仅是编写一个简短的格式化算法,而是关于理解不同国家的不同数字格式和用法。

当然,您可以将荷兰语数字(我假设您完全了解并理解荷兰语电话号码格式)转换为所描述的格式,并通过删除任何类型的所有空格来转换每个外国号码,并将前导“00”替换为“+” - 如果你不想要快速和肮脏的解决方案,你还有很多工作要做。

答案 2 :(得分:1)

这很有意思,因为在荷兰,这不是标准化的荷兰手机号码格式(全部以06开头)。

你应该写这个测试驱动。你想要涵盖很多有趣的案例,这样你至少可以展示你做什么和你不转换什么。

答案 3 :(得分:0)

您可以使用此功能:

function maskPhoneNumber(num, mask) {
  let regex = ''
  let i = 0
  const format = mask.replace(/(#+)/g, (match) => {
    regex += `([\+\\d]{${match.length}})`
    i ++
    return `$${i}`
  })
  return num.replace(new RegExp(regex), format).substr(0, mask.length)
}

console.error(maskPhoneNumber('+310612345678', '### (#)## ### ####')) 
// "+31 (0)61 234 5678"

相关问题