Есть ли функция или простой способ сократить телефонные номера до определенного формата?
Ввод может быть числом (мобильный, разные коды стран)
может быть
+4917112345678
+49171/12345678
0049171 12345678
или может быть из другой страны
004312345678
+44...
Я делаю
$mobile_new = preg_replace("/[^0-9]/","",$mobile);
чтобы убить все, кроме числа, потому что мне нужно это в формате 49171 (без + или 00 в начале), но мне нужно обрабатывать, если сначала вставляется 00 или, возможно, кто-то использует +49 (0) 171 или или входы 0171 (должно быть 49171.
поэтому первые числа ВСЕГДА должны быть в сельской местности без + / 00 и без (0) между ними.
Может кто-нибудь дать мне совет, как решить эту проблему?
Ты можешь использовать
(?:^(?:00|\+|\+\d{2}))|\/|\s|\(\d\)
чтобы соответствовать большинству ваших дел и просто заменить их ничем. Например:
$mobile = "+4917112345678";
$mobile_new = preg_replace("/(?:^(?:00|\+|\+\d{2}))|\/|\s|\(\d\)/","",$mobile);
echo $mobile_new;
//output: 4917112345678
Объяснение:
Я использую OR
здесь, сопоставляя каждый из ваших случаев один за другим:
(?:^(?:00|\+|\+\d{2}))
Матчи 00
, +
или же +
с двумя числами в начале вашей строки\/
соответствует /
где-нибудь в строке\s
соответствует пробелу в любом месте строки (соответствует символу новой строки в демонстрационном файле regex101, но я полагаю, что вы сопоставляете каждое число самостоятельно)\(\d\)
соответствует номеру в скобках в любом месте строкиЕдинственный случай, не охваченный этим регулярным выражением — это формат ввода 01712345678
, так как вы можете только догадываться, каким может быть префикс конкретной страны. Если вы хотите, чтобы это было 49
по умолчанию, затем просто замените каждый вход, начиная с одного 0
с 49
:
$mobile = "01712345678";
$mobile_new = preg_replace("/^0/","49",$mobile);
echo $mobile_new;
//output: 491712345678
Этот шаблон (49)\(?([0-9]{3})[\)\s\/]?([0-9]{8})
разделим число на три группы:
После матча вы можете построить чистое число, просто объединяя их \1\2\3
,
Демо-версия: https://regex101.com/r/tE5iY3/1
Если это вас не устраивает, пожалуйста, объясните более точно, что вы хотите, с тестовым вводом и ожидаемым выходом.
Я рекомендую взглянуть на LibPhoneNumber от Google и его порт для PHP.
Он поддерживает многие форматы и страны и поддерживается в хорошем состоянии. Лучше не разбираться в этом самостоятельно.
https://github.com/giggsey/libphonenumber-for-php
$phoneUtil = \libphonenumber\PhoneNumberUtil::getInstance();
$usNumberProto = $phoneUtil->parse("+1 650 253 0000", "US");