1

我有这个正则表达式:

/(.*)(([0-9]([^a-zA-Z])*){7,}[0-9])(.*)/.

给定以下值

0654535263
065453-.-5263
065asd4535263

预期成绩

06**** 
06****
06****

实际结果

0654535263
06****
065asd4535263

它与最后一行不匹配,因为字母(我想从 0-3 个字母匹配)并且它只匹配最后一次出现(在示例的第二行中,它跳过第一行)。

首先感谢你们所有的回答都非常有帮助,我欠你们时间。我不能创建数字数组并像这样屏蔽它们,因为我可以有这样的字符串:

我是约翰,我的电话号码是:0、6、5、4、5、3、5、2、6 - 3 -- 065asd4535263。

为了简化,我想隐藏输入的手机号码。

我有两个问题:

  1. 更改上面提到的 regxp,以隐藏不超过 3 个字符分隔的数字。
  2. preg_replace 只替换了一次。

最后,我只需要正则表达式来替换任何数字数组,至少 6 位长,由任意数量的特殊字符分隔(12--654-5、453/--222、23....5645 等)或不超过 3 个字符(过滤器)(06asd453、123as562)。

再次感谢您,所有答案都很有帮助,但我很生气,因为我没有正确地提出我的问题。

PS我不能给你声誉,因为我必须至少有15个,一旦我得到那么多,我就会“投票”,所有答案都值得。

4

3 回答 3

3

嗯,当你只想掩盖你的字符串时,为什么这么复杂。

$input = '0654535263';
$input = substr($input, 0, 2);
$output = $input . '********';

当您只需要字符串的前 2 个字符时,它会更容易一些。也许你的解决方案有另一个罪过。但这要容易一些。

于 2012-11-19T16:51:42.817 回答
2

你可以使用substr_replace

 echo substr_replace($v, "****", 2);

例子

$list = array("0654535263","065453-.-5263","065asd4535263");
echo "<pre>";
foreach ( $list as $v ) {
    echo substr_replace($v, "****", 2), PHP_EOL;
}

输出

06****
06****
06****
于 2012-11-19T16:57:12.977 回答
1

我猜你想使用正则表达式的原因是你不会掩盖你得到的每一个字符串。此正则表达式检查字符串的开头是否至少有 2 个数字,然后是 0 到 3 个字母字符,然后字符串的所有其余字符都需要是非字母字符。如果匹配,则屏蔽字符串,否则表示字符串不匹配。

$string = '0654535263';
if(preg_match('~^(\d{2})\d*?[a-zA-Z]{0,3}[^a-zA-Z]*$~', $string))
  $answer = preg_replace('~^(\d{2})\d*?[a-zA-Z]{0,3}[^a-zA-Z]*$~', '$1****', $string);
else
  $answer = $string . ' does not match';
print_r($answer); // 06****
于 2012-11-19T17:07:01.323 回答