在PHP中向美国电话号码添加破折号的函数


Function to add dashes to US phone number in PHP

在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解决方案相比:

250000次迭代:

preg_replace: 1.23秒丑解:0.866秒

p

下面是我使用的。它不是完美的,但它比@Thilo的答案要好。它检查前导1。如果它存在,它会忽略它。该代码还忽略分隔破折号、逗号和空格,因此它将适用于1231231234123 123 1234123.123.1234。它不处理带括号的数字,但我确信有另一个线程在那里的解决方案!

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

对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;
  }

我是这么想的:

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);