为电话号码添加自定义掩码

所以我正在创建一个简单的函数来屏蔽电话号码。我的电话号码有 9 位数字,我希望preg_replace它们带有给定的掩码,例如2-2-2-1-2or3-2-2-2等。


我试过这个:


$mask = explode('-', '3-2-2-2');


$pattern = '';

$replace = '';


foreach ($mask as $key => $value) {

    if ($key == 0) {

        $pattern = '/\(?(\d{' . $value . '})\)?[- ]';

        $replace = '$' . ++$key . '-';

        continue;

    }


    if ($key == count($mask) - 1) {

        $pattern .= '?(\d{' . $value . '})/';

        $replace .= '$' . ++$key;

        break;

    }


    $pattern .= '?(\d{' . $value . '})[- ]';

    $replace .= '$' . ++$key . '-';

}



return preg_replace($pattern, $replace, '902000810');

结果是902-00-08-10。有时会出错preg_replace(): No ending delimiter '/' found。我怎样才能将其重构为不出错?


蛊毒传说
浏览 149回答 2
2回答

30秒到达战场

假设:$num = '902000810';$mask = explode('-', '3-2-2-2');除了使用正则表达式从掩码格式化电话号码外,还有其他方法。使用格式化字符串:$maskPH = array_map(fn($i) => "%{$i}s", $mask);$formatI = implode('', $maskPH);$formatO = implode('-', $maskPH);$result = vsprintf($formatO, sscanf($num, $formatI));使用unpack:$format = array_reduce($mask, function ($c, $i) {    static $j = 0;    return "{$c}A{$i}_" . $j++ . "/";});$result = implode('-', unpack($format, $num));

森栏

preg_replace(): No ending delimiter '/' found 意味着您的模式不会以 a/作为最后一个字符终止。但是这三种模式都缺乏正确的格式:您应该相应地修改它们。从:$pattern = '/\(?(\d{' . $value . '})\)?[- ]';$pattern .= '?(\d{' . $value . '})/';$pattern .= '?(\d{' . $value . '})[- ]';到:$pattern = '/\(?(\d{' . $value . '})\)?[- ]/';$pattern .= '/?(\d{' . $value . '})/';$pattern .= '/?(\d{' . $value . '})[- ]/';
打开App,查看更多内容
随时随地看视频慕课网APP