在电话号码中添加自定义掩码

时间:2020-06-14 16:23:15

标签: php regex preg-replace

因此,我正在创建一个简单的函数来屏蔽电话号码。我的电话号码有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。我该如何重构它以免出错?

2 个答案:

答案 0 :(得分:1)

假设:

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

答案 1 :(得分:0)

preg_replace(): No ending delimiter '/' found 表示您的模式不会以/作为最后一个字符结尾。

但是所有三种模式都缺乏正确的格式:

您应该进行相应的修改。

发件人:

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

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

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

收件人:

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

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

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

相关问题