我需要格式化手机号码。 e.g。
+61421 123 123
0421 123 123
0061421123123
0421 123123
1)将这种类型的字符串保存在dbf
中0421123123
2)然后以这种格式显示
0421 123 123
有关格式化数字的最有效方法的任何建议吗?
答案 0 :(得分:4)
显示:
或许您可以将已经格式化的字符串存储到数据库中。
修改(回答评论中的问题)。这似乎做得很好:
$s = '421123123';
$formatted = '0'.chunk_split($s, 3, ' ');
答案 1 :(得分:2)
以下是澳大利亚手机号码的一些有效格式:
所有这些都包括从04开始的10位数字,因此您可以删除空格并检查所有数字,起始数字和长度,但它与国际格式电话号码更加相符。这增加了这些情况:
您可以在前面添加00,但只能在某些使用00作为国际拨号前缀的国家/地区使用。我相信英国就是其中之一。所以棘手的部分是:
我会建议L
如果你没有留下10位数,从04开始拒绝它。否则,请使用以下两种格式之一格式化它:
答案 2 :(得分:1)
这是一个PHP函数,可以正确格式化电话号码,使第一个空格位于区号之后,其余部分均分为两部分。此处的代码特定于芬兰的areacodes(并未考虑国家/地区代码),但会根据需要进行修改:
// Formats 0451234567 => 045 1234 567
function format_phone($phone) {
// List your area codes here
$phone = preg_replace('/(02|03|05|06|08|09|013|014|015|016|017|018|019|020|040|041|042|043|044|045|046|050)/', '$1 ', $phone);
list($d, $p) = explode(' ', $phone);
$split_point = ceil(strlen($p) / 2);
$p = substr($p, 0, $split_point).' '.substr($p, $split_point);
return $d.' '.$p;
}
对于保存到数据库部分,只需将非数字字符,子字符串删除到特定长度并插入db。如果您所在国家/地区的电话号码格式相似且长度为9位(不含前缀0),则可以使用以下电话号码从电话号码中取出最后9位数字:
$phone = substr($phone, strlen($phone) - 9):
并在前面添加0。因此,这有效地将国家代码变为0,但仅在所有电话号码长度相同的情况下才有效。
答案 3 :(得分:1)
有更多有效的方法可以做到这一点,以下代码的内存使用并不完美(修改传入参数),但如果你想在不使用正则表达式的情况下遵循逻辑,这将有效(注意不是处理13或1800个数字,但如果您需要这些数字也很容易修复):
function fmtAusPhoneNum($phoneNum) {
// First strip spaces and non numerics
$phoneNum = preg_replace('/\D+/', '', $phoneNum);
// Strip AUS international access code
if (substr($phoneNum, 0, 4) == '0011') {
$phoneNum = substr($phoneNum, 4, strlen($phoneNum) - 4);
}
// Strip UK (and some others) international code
if (substr($phoneNum, 0, 2) == '00') {
$phoneNum = substr($phoneNum, 2, strlen($phoneNum) - 2);
}
// Add any other international prefixes here.
// If first 2 digits are '61' then international format, take off 2
if (substr($phoneNum, 0, 2) == '61') {
$phoneNum = substr($phoneNum, 2, strlen($phoneNum) - 2);
}
// If STD 0 code, take it off.
elseif (substr($phoneNum, 0, 1) == '0') {
$phoneNum = substr($phoneNum, 1, strlen($phoneNum) - 1);
}
// Now should have a 9 char long digit.
if (strlen($phoneNum)!=9) {
echo "Warning: can't parse Australian number - less access codes, should have 9 digits only\n";
}
// If first digit is 4, it's a mobile, format 04xx xxx xxx
if (substr($phoneNum, 0, 1) == '4') {
$phoneNum = '0' . substr($phoneNum, 0, 3) . ' ' . substr($phoneNum, 3, 3) . ' ' . substr($phoneNum, 6, 3);
} else {
// It's a landline number, split into area code eg 03 and 2 lots of 4 digits
$phoneNum = '0' . substr($phoneNum, 0, 1) . ' ' . substr($phoneNum, 1, 4) . ' ' . substr($phoneNum, 5, 4);
}
return $phoneNum;
}
// Test it
echo fmtAusPhoneNum('0061 421 123 123') . "\n";
echo fmtAusPhoneNum('0421741940') . "\n";
echo fmtAusPhoneNum('+61421741940') . "\n";
echo fmtAusPhoneNum('61394190231') . "\n";
echo fmtAusPhoneNum('03 5521 7475') . "\n";
答案 4 :(得分:0)
这不适合正则表达式。如何(a)删除非数字,(b)拒绝10个字符,(c)使用子字符串格式。
答案 5 :(得分:0)
^(?:\+61|0061|0)(\d{3})\s*(\d{3})\s*(\d{3})$
这个正则表达式将匹配任何示例,在后向引号1中捕获421
,在{0}中捕获123
。 2,123
没有。 3。
因此,如果您使用0\1\2\3
作为替换字符串,则会获得0421123123
,如果您使用0\1 \2 \3
,则会获得0421 123 123
。