繁体   English   中英

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

[英]php regex replace each character with asterisk

我正在尝试这样的事情。

隐藏用户(前3个字符除外)。

例)

  • 苹果->应用**
  • 谷歌-> goo ***
  • 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}|(?!^)\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时,会发生这种情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM