php 正则表达式用星号替换每个字符
php regex replace each character with asterisk
我正在尝试这样的事情。
隐藏除前 3 个字符以外的用户。
EX)
- 苹果 -> 应用**
- google -> goo***
- abc12345 ->abc*****
我目前正在使用 php 这样的:
$string = "abcd1234";
$regex = '/(?<=^(.{3}))(.*)$/';
$replacement = '*';
$changed = preg_replace($regex,$replacement,$string);
echo $changed;
结果如下:
abc*
但我想替换除前 3 个字符之外的每个字符 - 例如:
abc*****
我该怎么办?
您的正则表达式匹配前 3 个之后的所有符号,因此,您将它们替换为一个硬编码的 *
。
您可以使用
'~(^.{3}|(?!^)\G)\K.~'
并替换为*
。参见 regex demo
此正则表达式匹配前 3 个字符(使用 ^.{3}
)或上一次成功匹配的结尾或字符串的开头(使用 (?!^)\G
),然后省略匹配的字符匹配值(使用 \K
)并使用 .
.
匹配除换行符之外的任何字符
$re = '~(^.{3}|(?!^)\G)\K.~';
$strs = array("aa","apple", "google", "abc12345", "asdddd");
foreach ($strs as $s) {
$result = preg_replace($re, "*", $s);
echo $result . PHP_EOL;
}
不要使用正则表达式,使用 substr_replace:
$var = "abcdef";
$charToKeep = 3;
echo strlen($var) > $charToKeep ? substr_replace($var, str_repeat ( '*' , strlen($var) - $charToKeep), $charToKeep) : $var;
请记住,正则表达式非常适合匹配字符串中的模式,但是 很多 函数已经设计用于字符串操作。
将输出:
abc***
另一种可能的解决方案是将前三个字符与 *
重复正确次数的字符串连接起来:
$text = substr($string, 0, 3).str_repeat('*', max(0, strlen($string) - 3));
max()
is needed to avoid str_repeat()
的用法在收到否定参数时发出警告。当 $string
的长度小于 3.
时会出现这种情况
试试这个功能。您可以指定应显示多少字符以及应将哪个字符用作掩码:
$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 个字符以外的用户。
EX)
- 苹果 -> 应用**
- google -> goo***
- abc12345 ->abc*****
我目前正在使用 php 这样的:
$string = "abcd1234";
$regex = '/(?<=^(.{3}))(.*)$/';
$replacement = '*';
$changed = preg_replace($regex,$replacement,$string);
echo $changed;
结果如下:
abc*
但我想替换除前 3 个字符之外的每个字符 - 例如:
abc*****
我该怎么办?
您的正则表达式匹配前 3 个之后的所有符号,因此,您将它们替换为一个硬编码的 *
。
您可以使用
'~(^.{3}|(?!^)\G)\K.~'
并替换为*
。参见 regex demo
此正则表达式匹配前 3 个字符(使用 ^.{3}
)或上一次成功匹配的结尾或字符串的开头(使用 (?!^)\G
),然后省略匹配的字符匹配值(使用 \K
)并使用 .
.
$re = '~(^.{3}|(?!^)\G)\K.~';
$strs = array("aa","apple", "google", "abc12345", "asdddd");
foreach ($strs as $s) {
$result = preg_replace($re, "*", $s);
echo $result . PHP_EOL;
}
不要使用正则表达式,使用 substr_replace:
$var = "abcdef";
$charToKeep = 3;
echo strlen($var) > $charToKeep ? substr_replace($var, str_repeat ( '*' , strlen($var) - $charToKeep), $charToKeep) : $var;
请记住,正则表达式非常适合匹配字符串中的模式,但是 很多 函数已经设计用于字符串操作。
将输出:
abc***
另一种可能的解决方案是将前三个字符与 *
重复正确次数的字符串连接起来:
$text = substr($string, 0, 3).str_repeat('*', max(0, strlen($string) - 3));
max()
is needed to avoid str_repeat()
的用法在收到否定参数时发出警告。当 $string
的长度小于 3.
试试这个功能。您可以指定应显示多少字符以及应将哪个字符用作掩码:
$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*****