What is the best way to add dashes to a phone number in PHP? I have a number in the format xxxxxxxxxx and I want it to be in the format xxx-xxx-xxxx. This only applies to 10 digit US phone numbers.
- 18,876
- 54
- 209
- 353
-
I think `add_dashes_to_number()` might work ;) – Blender May 03 '11 at 15:48
-
This is supposed to be a serious question. I wasn't sure whether substr, str_split, chunk_split or something else would be the best thing to use. – Catfish May 03 '11 at 15:51
-
why wouldnt you use jquery validation or something and handle this on client side? – Trevor Arjeski May 03 '11 at 15:53
-
Because it might screw up the serverside. I'm not sure how, but it might. – Blender May 03 '11 at 15:53
-
Because I want a server side solution so that the format is always the same regardless of js. – Catfish May 03 '11 at 15:54
7 Answers
$number = "1234567890";
$formatted_number = preg_replace("/^(\d{3})(\d{3})(\d{4})$/", "$1-$2-$3", $number);
EDIT: To be a bit more generic and normalize a US phone number given in any of a variety of formats (which should be common practice - there's no reason to force people to type in a phone number in a specific format, since all you're interested in are the digits and you can simply discard the rest):
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";
- 17,565
- 5
- 68
- 84
-
-
1@Galen: be wary of absolutes like "Fastest". A faster solution then this is `$formatted = "$number[0]$number[1]$number[2]-$number[3] ...` til the string is done. – Erik May 03 '11 at 17:25
-
By fastest i meant fastest of the methods that were provided at that time – Galen May 03 '11 at 17:54
-
Fast shouldn't really matter here unless you plan on applying this to aproximately 4,567,138,234,234 phone numbers at a time. – Thilo May 03 '11 at 17:56
-
1To take this a step further, prepare the pattern for an extension of an indefinite number of digits. $formatted_number = preg_replace("/^(\d{3})(\d{3})(\d{4})(\d{1,})$/", "$1-$2-$3-$4", $number); – Rivers Mar 03 '12 at 00:22
-
In my case, this worked out: **$formatted_number = preg_replace("/^(\d{3})(\d{7})$/", "$1-$2", $number);** – shasi kanth Dec 17 '13 at 07:50
-
$number = '1234567890';
if(ctype_digit($number) && strlen($number) == 10) {
$number = substr($number, 0, 3) .'-'.
substr($number, 3, 3) .'-'.
substr($number, 6);
}
Or if you for some reason want to avoid substr:
$number = '1234567890';
if(ctype_digit($number) && strlen($number) == 10) {
$parts = str_split($number, 3);
$number = $parts[0] .'-'. $parts[1] .'-'. $parts[3].$parts[4];
}
- 90,431
- 16
- 141
- 175
iterate through the string and make counter. When counter is 3 or 7 insert dash.
- 11,299
- 6
- 47
- 76
I feel obliged to post. Cheesiest solution:
$number = "1234567890";
$formatted_number = "$number[0]$number[1]$number[2]-$number[3]$number[4]$number[5]-$number[6]$number[7]$number[8]$number[9]";
But it works and its fast. vs. the preg_replace solution:
250,000 iterations:
preg_replace: 1.23 seconds ugly solution: 0.866 seconds
Pretty meaningless but fun :P
- 20,526
- 8
- 45
- 76
-
Now plug "foo" into your string. Poof. With preg_replace, all you get is the original string back if the regex doesn't match. I'd choose robustness vs speed here. :) – Thilo May 03 '11 at 17:58
-
oh i wasn't suggesting you USE the above code. I posted it really because of galen's comment, and it amused me. Your original question gave the assumption of a string of 10 digits, for which this works. You didn't say anything about validating it as a proper phone number. – Erik May 03 '11 at 18:00
-
Wasn't my question, just my answer. I'm just advocating defensive coding practices. – Thilo May 03 '11 at 18:16
-
-
@thilo in most cases I would have answered very similarly to you. Actually I did: http://stackoverflow.com/questions/2315355/how-can-i-split-this-string-with-a-hyphen/2315377#2315377 months ago, to a nearly identical question. – Erik May 03 '11 at 19:41
Here's what I used. It's not perfect, but it's an improvement over @Thilo's answer. It checks for a leading 1. If it's there, it ignores it. The code also ignores separating dashes, commas, and spaces, so it will work with 1231231234, 123 123 1234, and 123.123.1234. It doesn't handle numbers with parenthesis, but I'm sure there's another thread out there with that solution!
$formatted_number = preg_replace("/^1?(?:[- .])?(\d{3})(?:[- .])?(\d{3})(?:[- .])?(\d{4})$/", "($1) $2-$3", $not_formatted_phone_number);
- 1,310
- 11
- 9
A modification of Thilo's answer providing complete conditional formatting control over the leading "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;
}
- 94
- 8
Here's what I came up with:
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);
- 163
- 2
- 6
-
-
String Replace uses Reg Ex. The idea is to valilidate the 10 digit phone number the user enters into a form in whatever format. The funtion then removes any formatting the user puts in, leaving only the ten digtits, then displays the phone number is a specified format. – AnarchyOutlaw Mar 29 '19 at 19:43