Каков наилучший способ добавить тире к номеру телефона в PHP? У меня есть номер в формате xxxxxxxxxx
, и я хочу, чтобы он был в формате xxx-xxx-xxxx. Это относится только к 10-значным номерам телефонов США.
Функция добавления тире к номеру телефона США в PHP
Ответ 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);