将自定义掩码添加到 phone 个号码
Adding custom masks to phone numbers
所以我正在创建一个简单的函数来屏蔽 phone 数字。我的 phone 号码有 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
。我怎样才能重构它以避免出错?
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));
所以我正在创建一个简单的函数来屏蔽 phone 数字。我的 phone 号码有 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
。我怎样才能重构它以避免出错?
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));