将自定义掩码添加到 phone 个号码

Adding custom masks to phone numbers

所以我正在创建一个简单的函数来屏蔽 phone 数字。我的 phone 号码有 9 位数字,我想要 preg_replace 它们带有给定的掩码,例如 2-2-2-1-23-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。我怎样才能重构它以避免出错?

preg_replace(): No ending delimiter '/' found 意味着您的模式不会以 / 作为最后一个字符终止。

但是这三种模式都缺少正确的格式:

您应该相应地修改它们。

发件人:

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

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

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

收件人:

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

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

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

假设:

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

除了使用正则表达式格式化掩码中的 phone 数字之外,还有其他方法。

  • 使用格式化字符串:

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