因此,我正在创建一个简单的函数来屏蔽电话号码。我的电话号码有9位数字,我希望preg_replace
带有给定的掩码,例如2-2-2-1-2
或3-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
。我该如何重构它以免出错?
答案 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 . '})[- ]/';