php正则表达式用星号替换每个字符

时间:2016-03-10 08:48:46

标签: php regex lookbehind

我正在尝试这样的事情。

隐藏除前3个字符以外的用户。

EX)

  • apple - > app **
  • google - > goo ***
  • abc12345 - > abc *****

我目前正在使用这样的PHP:

$string = "abcd1234";
$regex = '/(?<=^(.{3}))(.*)$/';
$replacement = '*';
$changed = preg_replace($regex,$replacement,$string);
echo $changed;

结果如下:

abc*

但是我想替换除前3个以外的每个角色 - 比如:

abc*****

我该怎么办?

4 个答案:

答案 0 :(得分:3)

请勿使用正则表达式,请使用substr_replace

$var = "abcdef";
$charToKeep = 3;
echo strlen($var) > $charToKeep ?  substr_replace($var, str_repeat ( '*' ,  strlen($var) - $charToKeep), $charToKeep) : $var;

请记住,正则表达式适合匹配字符串中的模式,但已经为字符串操作设计了很多函数。

将输出:

  

ABC ***

答案 1 :(得分:1)

试试这个功能。您可以指定应显示多少个字符以及应将哪个字符用作掩码:

True
14:08:33:806443
14:08:02:318642
0:00:31.487801

输出:

  

ABC *****

答案 2 :(得分:0)

你的正则表达式匹配前3个后面的所有符号,因此,你用一个硬编码的*替换它们。

您可以使用

'~(^.{3}|(?!^)\G)\K.~'

并替换为*。请参阅regex demo

此正则表达式匹配前3个字符(带^.{3})或上一个成功匹配的结束或字符串的开头(带(?!^)\G),然后省略匹配值匹配的字符(使用\K)并匹配任何字符,但换行符为.

请参阅IDEONE demo

$re = '~(^.{3}|(?!^)\G)\K.~'; 
$strs = array("aa","apple", "google", "abc12345", "asdddd"); 
foreach ($strs as $s) {
    $result = preg_replace($re, "*", $s);
    echo $result . PHP_EOL;
}

答案 3 :(得分:0)

另一种可能的解决方案是将前三个字符连接成一串*重复正确的次数:

$text = substr($string, 0, 3).str_repeat('*', max(0, strlen($string) - 3));

需要使用max()以避免str_repeat()在收到否定参数时发出警告。当$string的长度小于3时会发生这种情况。