форматирование австралийских мобильных номеров - PullRequest
1 голос
/ 04 декабря 2009

Мне нужно отформатировать мобильные номера. например,

+61421 123 123
0421 123 123
0061421123123
0421 123123

1) в этот тип строки для сохранения в dbf

0421123123 

2) затем отобразите его в этом формате

0421 123 123

есть предложения по наиболее эффективному способу форматирования чисел?

Ответы [ 6 ]

4 голосов
/ 04 декабря 2009
  • удалить нецифровые символы из входной строки
  • вырезать последние 9 цифр
  • добавьте ноль и сохраните

Для отображения:

  • вставьте пробелы, где это необходимо

Или, может быть, вы можете просто сохранить уже отформатированную строку в БД.

edit (чтобы ответить на вопрос в комментарии). Это, кажется, делает работу просто отлично:

$s = '421123123';
$formatted = '0'.chunk_split($s, 3, ' ');
2 голосов
/ 04 декабря 2009

Вот некоторые допустимые форматы для номеров мобильных телефонов в Австралии:

  • 0401 123 234
  • 041 123 3456
  • 0412 23 23 34 (редко)

Все они состоят из 10 цифр, начиная с 04, так что вы можете удалить пробелы и проверить все цифры, начальные цифры и длину, но это больше соответствует номерам телефонов в международном формате. Это добавляет эти случаи:

  • 61 411 234 345
  • + 61 411 234 345
  • + 61 (0) 411 234 345
  • и т.д.

Вы можете указать 00 спереди, но это можно использовать только в некоторых странах, которые используют 00 в качестве префикса международного набора. Я верю, что Великобритания одна. Итак, хитрые части:

  • Код страны: optinal
  • Код страны может начинаться с префикса +
  • Если код страны присутствует, то начальный 0 может быть удален или заменен на (0)
  • Может использоваться префикс международного набора
  • Несоответствие между группами цифр
  • В редких случаях вместо пробелов могут использоваться дефисы

Что бы я предложил L

  1. Лента, ведущая 00, если она есть;
  2. Лента, ведущая +, если она есть;
  3. Лента ведущая 61, если она существует;
  4. Заменить ведущий (0) на 0;
  5. Добавить ведущий 0, если его еще нет.
  6. Удалите все дефисы и пробелы.

Если у вас нет 10 цифр, начиная с 04, отклоните его. В противном случае отформатируйте его в одном из следующих двух форматов:

  • Внутренний: 0412 345 789
  • Международный: +61 (0) 412 345 789
1 голос
/ 07 мая 2015

Есть гораздо более эффективные способы сделать это, и использование памяти следующего кода не идеально (изменение входящего параметра), но если вы хотите следовать логике без использования регулярных выражений, это будет работать (примечание не обрабатывать 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";
1 голос
/ 04 декабря 2009

Вот функция PHP, которая правильно форматирует телефонный номер, так что первый пробел идет после кода города, а остальные делятся равномерно на две части. Код здесь специфичен для финских ареакодов (и не учитывает коды стран), но при необходимости изменяется:

// 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;
}

Для сохранения в части базы данных, просто удалите символы, которые не являются числовыми, подставьте до определенной длины и вставьте в БД. Если телефонные номера вашей страны одинаково отформатированы и имеют длину 9 цифр (без префикса 0), вы можете просто взять последние 9 цифр из номера телефона, используя:

$phone = substr($phone, strlen($phone) - 9):

И добавьте 0 вперед. Таким образом, это эффективно превращает код страны в 0, но работает, только если все телефонные номера имеют одинаковую длину.

0 голосов
/ 04 декабря 2009
^(?:\+61|0061|0)(\d{3})\s*(\d{3})\s*(\d{3})$

Это регулярное выражение будет соответствовать любому из примеров, захватывая 421 в обратной ссылке № 1, 123 в №. 2 и 123 в № 3.

Итак, если вы используете 0\1\2\3 в качестве строки замены, вы получите 0421123123, а если вы используете 0\1 \2 \3, вы получите 0421 123 123.

0 голосов
/ 04 декабря 2009

Это не совсем подходит для регулярных выражений. Как насчет (а) удаления не цифр, (б) отклонения, если не 10 символов, (в) форматирования с использованием подстрок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...