Каков наилучший способ добавить тире к номеру телефона в PHP? У меня есть номер в формате xxxxxxxxxx
и я хочу, чтобы он был в формате xxx-xxx-xxxx. Это относится только к 10-значным номерам телефонов США.
$number = "1234567890"; $formatted_number = preg_replace("/^(\d{3})(\d{3})(\d{4})$/", "$1-$2-$3", $number);
EDIT : чтобы быть более общим и нормализовать номер телефона в США, предоставленный в любом из различных форматов (что должно быть обычной практикой – нет причин заставить людей вводить номер телефона в определенном формате, поскольку все, вас интересуют цифры, и вы можете просто отказаться от остальных):
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";
$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 или 7, введите тире.
Я чувствую себя обязанным публиковать. Самое сырое решение:
$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
Вот что я использовал. Это не идеально, но это улучшение по сравнению с ответом Тило. Он проверяет ведущий 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);
Вот что я придумал:
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);