Функция добавления тире к номеру телефона США в PHP

Каков наилучший способ добавить тире к номеру телефона в PHP? У меня есть номер в формате xxxxxxxxxx, и я хочу, чтобы он был в формате xxx-xxx-xxxx. Это относится только к 10-значным номерам телефонов США.

Ответ 1

$number = "1234567890";
$formatted_number = preg_replace("/^(\d{3})(\d{3})(\d{4})$/", "$1-$2-$3", $number);

РЕДАКТИРОВАТЬ. Чтобы быть более родовым и нормализовать телефонный номер США, указанный в любом из разных форматов (что должно быть обычной практикой - нет причин заставить людей вводить телефон номер в определенном формате, так как все, что вас интересует, это цифры, и вы можете просто отказаться от остальных):

function localize_us_number($phone) {
  $numbers_only = preg_replace("/[^\d]/", "", $phone);
  return preg_replace("/^1?(\d{3})(\d{3})(\d{4})$/", "$1-$2-$3", $numbers_only);
}

echo localize_us_number("5551234567"), "\n";
echo localize_us_number("15551234567"), "\n";
echo localize_us_number("+15551234567"), "\n";
echo localize_us_number("(555) 123-4567"), "\n";
echo localize_us_number("+1 (555) 123-4567"), "\n";
echo localize_us_number("Phone: 555 1234567 or something"), "\n";

Ответ 2

$number = '1234567890';
if(ctype_digit($number) && strlen($number) == 10) {
  $number = substr($number, 0, 3) .'-'.
            substr($number, 3, 3) .'-'.
            substr($number, 6);
}

Или если вы по какой-то причине хотите избежать substr, но это больше ресурсов, голодных (не так много - выберите тот, который вы предпочитаете):

$number = '1234567890';
if(ctype_digit($number) && strlen($number) == 10) {
  $parts = str_split($number, 3);
  $number = $parts[0] .'-'. $parts[1] .'-'. $parts[3].$parts[4];
}

Ответ 3

итерации по строке и создания счетчика. Если счетчик равен 3 или 7, введите тире.

Ответ 4

Я чувствую себя обязанным публиковать. Самое сырое решение:

$number = "1234567890";
$formatted_number = "$number[0]$number[1]$number[2]-$number[3]$number[4]$number[5]-$number[6]$number[7]$number[8]$number[9]";

Но он работает и быстро. против решения preg_replace:

250 000 итераций:

preg_replace: 1,23 секунды уродливое решение: 0,866 секунды

Довольно бессмысленно, но весело: P

Ответ 5

Вот что я использовал. Это не идеально, но это улучшение по сравнению с @Thilo. Он проверяет ведущий 1. Если он там, он игнорирует его. Код также игнорирует разделение тире, запятых и пробелов, поэтому он будет работать с 1231231234, 123 123 1234 и 123.123.1234. Он не обрабатывает числа с круглыми скобками, но я уверен, что там есть другой поток с этим решением!

$formatted_number = preg_replace("/^1?(?:[- .])?(\d{3})(?:[- .])?(\d{3})(?:[- .])?(\d{4})$/", "($1) $2-$3", $not_formatted_phone_number);

Ответ 6

Модификация ответа Thilo, обеспечивающая полный контроль условного форматирования над лидирующей "1".

public function phoneFormat($number) {
        $numbersOnly = preg_replace("/[^\d]/", "", $number);
        $nums = array_filter(explode("-", preg_replace("/^(1|)(\d{3})(\d{3})(\d{4})$/",
                                                            "$1-$2-$3-$4", $numbersOnly)));
        $output = $numbersOnly;
        if(count($nums) == 3){
            $output = "($nums[1])-$nums[2]-$nums[3]";
        }elseif(count($nums) == 4){
            $output = "$nums[0]-($nums[1])-$nums[2]-$nums[3]";
        }
        return $output;
  }

Ответ 7

Вот что я придумал:

function format_phone($var_num) {
    $var_num = trim($var_num);
    $var_num = str_replace("(","",$var_num);
    $var_num = str_replace(")","",$var_num);
    $var_num = str_replace("-","",$var_num);
    $var_num = str_replace(" ","",$var_num);
    $var_num = str_replace(".","",$var_num);
    $var_num = substr($var_num, -10);
    $var_area_code = substr($var_num, 0, -7);
    $var_exchange = substr($var_num, 3, -4);
    $var_extention = substr($var_num, -4);
    $var_return = "{$var_area_code}-{$var_exchange}-{$var_extention}";
    return $var_return;
}

// Examples:
$phone_number = "1 (757) 555-1212";
// $phone_number = "17575551212";
// $phone_number = "(757) 555-1212";
// $phone_number = "757.555.1212";
echo "{$phone_number} = " . format_phone($phone_number);