对于一个体面和标准化的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
答案 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"