PHP 正则表达式将每个字符替换为星号


php regex replace each character with asterisk

我正在尝试这样的事情。

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

例)

  • 苹果 ->应用程序**
  • 谷歌 -> 咕噜***
  • ABC12345 ->ABC*****

我目前正在像这样使用php:

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

结果是这样的:

abc*

但我想替换除前 3 个字符之外的每个字符 - 例如:

abc*****

我该怎么办?

不要使用正则表达式,请使用substr_replace:

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

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

将输出:

ABC***

试试这个函数。您可以指定应可见的字符数量以及应将哪个字符用作掩码:

$string = "abcd1234";
echo hideCharacters($string, 3, "*");
function hideCharacters($string, $visibleCharactersCount, $mask)
{
    if(strlen($string) < $visibleCharactersCount)
        return $string;
    $part = substr($string, 0, $visibleCharactersCount);
    return str_pad($part, strlen($string), $mask, STR_PAD_RIGHT);
}

输出:

ABC*****

您的正则表达式匹配前 3 个符号之后的所有符号,因此,您可以将它们替换为一个硬编码的*

您可以使用

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

并替换为*.查看正则表达式演示

此正则表达式匹配前 3 个字符(带 ^.{3})或上一个成功匹配的末尾或字符串的开头(带 (?!^)'G),然后省略匹配值中匹配的字符(带 'K ),并匹配除换行符以外的任何字符.

查看 IDEONE 演示

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

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

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

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