澳大利亚手机号码字符串格式

时间:2009-12-04 12:42:57

标签: php regex parsing

我需要格式化手机号码。 e.g。

+61421 123 123
0421 123 123
0061421123123
0421 123123

1)将这种类型的字符串保存在dbf

0421123123 

2)然后以这种格式显示

0421 123 123

有关格式化数字的最有效方法的任何建议吗?

6 个答案:

答案 0 :(得分:4)

  • 从输入字符串中删除非数字
  • 切片最后9位
  • 前置零并存储

显示:

  • 在适当的位置插入空格

或许您可以将已经格式化的字符串存储到数据库中。

修改(回答评论中的问题)。这似乎做得很好:

$s = '421123123';
$formatted = '0'.chunk_split($s, 3, ' ');

答案 1 :(得分:2)

以下是澳大利亚手机号码的一些有效格式:

  • 0401 123 234
  • 041 123 3456
  • 0412 23 23 34(罕见)

所有这些都包括从04开始的10位数字,因此您可以删除空格并检查所有数字,起始数字和长度,但它与国际格式电话号码更加相符。这增加了这些情况:

  • 61 411 234 345
  • +61 411 234 345
  • +61(0)411 234 345

您可以在前面添加00,但只能在某些使用00作为国际拨号前缀的国家/地区使用。我相信英国就是其中之一。所以棘手的部分是:

  • 国家/地区代码是
  • 国家/地区代码可能以+
  • 为前缀
  • 如果存在国家/地区代码,则可以删除前导0或替换为(0)
  • 可以使用国际拨号前缀
  • 数字组的间距不一致
  • 在极少数情况下,可以使用连字符代替空格

我会建议L

  1. 如果有,则剥离前导00;
  2. 剥离前导+如果有;
  3. 如果存在则剥离前导61;
  4. 将前导(0)替换为0;
  5. 如果没有前导0,则添加前导。
  6. 删除所有连字符和空格。
  7. 如果你没有留下10位数,从04开始拒绝它。否则,请使用以下两种格式之一格式化它:

    • 国内:0412 345 789
    • 国际:+61(0)412 345 789

答案 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