为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
蛊毒传说 2023-05-26 15:50:10
所以我正在创建一个简单的函数来屏蔽电话号码。我的电话号码有 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。我怎样才能将其重构为不出错?
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

假设:


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


查看完整回答
反对 回复 2023-05-26
?
森栏

TA贡献1810条经验 获得超5个赞

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 . '})[- ]/';


查看完整回答
反对 回复 2023-05-26
  • 2 回答
  • 0 关注
  • 148 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信