Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数在PHP中将破折号添加到美国电话号码_Php - Fatal编程技术网

函数在PHP中将破折号添加到美国电话号码

函数在PHP中将破折号添加到美国电话号码,php,Php,在PHP中,向电话号码添加破折号的最佳方法是什么?我有一个编号的格式是xxxxxxxxx,我希望它的格式是xxx-xxx-xxxxx。这仅适用于10位数的美国电话号码。遍历字符串并生成计数器。当计数器为3或7时,插入破折号 $number = '1234567890'; if(ctype_digit($number) && strlen($number) == 10) { $number = substr($number, 0, 3) .'-'. su

在PHP中,向电话号码添加破折号的最佳方法是什么?我有一个编号的格式是
xxxxxxxxx
,我希望它的格式是xxx-xxx-xxxxx。这仅适用于10位数的美国电话号码。

遍历字符串并生成计数器。当计数器为3或7时,插入破折号

$number = '1234567890';
if(ctype_digit($number) && strlen($number) == 10) {
  $number = substr($number, 0, 3) .'-'.
            substr($number, 3, 3) .'-'.
            substr($number, 6);
}
或者,如果您出于某种原因想要避免substr,但这更需要资源(虽然不是很多,但请选择您喜欢的一个):

编辑:为了更通用一点,并规范以各种格式给出的美国电话号码(这应该是常见的做法-没有理由强迫人们以特定格式键入电话号码,因为您感兴趣的只是数字,您可以简单地丢弃其余的数字):


我觉得有义务发帖。最廉价的解决方案:

$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_替换解决方案相比:

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

预更换:1.23秒 丑陋的解决方案:0.866秒


很无意义但很有趣:这是我用过的。这并不完美,但比@Thilo的答案有了改进。它检查前导的
1
。如果它在那里,它就会忽略它。代码还忽略分隔的破折号、逗号和空格,因此它将与
1234
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);

对Thilo答案的修改,提供了对前导“1”的完整条件格式控制


我认为
将破折号添加到\u number()
可能有效;)这应该是一个严肃的问题。我不确定substr、str\u split、chunk\u split或其他什么是最好的使用方法。为什么不使用jquery验证或其他方法在客户端处理这个问题?因为它可能会破坏服务器端。我不知道怎么做,但可能会。因为我想要一个服务器端解决方案,这样无论js如何,格式都是一样的。我做了一些测试,这是最快的method@Galen:警惕像“最快”这样的绝对词。一个更快的解决方案是
$formatted=“$number[0]$number[1]$number[2]-$number[3]…
直到字符串完成。我所说的最快是指当时提供的最快方法在这里并不重要,除非您计划一次将其应用于大约4567138234234个电话号码。要进一步,请准备无限数字扩展的模式。$formatted_number=preg_replace(“/^(\d{3})(\d{3})(\d{4})(\d{1,})$/”,“$1-$2-$3-$4”,$number);现在插入“foo”“放进你的绳子里。噗。使用preg_replace,如果正则表达式不匹配,您只需返回原始字符串。我会选择稳健性和速度哦,我不是建议你使用上面的代码。我把它贴出来是因为盖伦的评论,这让我很开心。你最初的问题假设一个10位数的字符串,这是可行的。你没有说要验证它是否是一个正确的电话号码。这不是我的问题,只是我的答案。我只是提倡防御性的编码实践。老实说,我甚至不知道这个解决方案是可能的。@thilo在大多数情况下,我的回答与您非常相似。事实上,几个月前,我问了一个几乎相同的问题。preg(正则表达式)比str_replaceString Replace uses Reg Ex工作得好得多。这个想法是将用户输入的10位电话号码以任何格式验证到表单中。然后,该功能删除用户输入的任何格式,只留下十位数字,然后显示指定格式的电话号码。
$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);
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;
  }