PHP регулярное выражение заменить каждый символ звездочкой

Я пытаюсь что-то вроде этого.

Скрытие пользователей кроме первых 3 символов.

EX)

  • яблоко -> приложение **
  • Google -> Goo ***
  • abc12345 -> abc *****

В настоящее время я использую PHP как это:

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

и результат будет таким:

abc*

Но я хочу сделать замену каждому символу, кроме первых 3 — как:

abc*****

Как я должен сделать?

1

Решение

Ваше регулярное выражение соответствует всем символам после первых 3, таким образом, вы заменяете их жестко закодированным *,

Ты можешь использовать

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

И заменить на *, Увидеть regex demo

Это регулярное выражение соответствует первым 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;
}
0

Другие решения

Не используйте регулярные выражения, используйте substr_replace:

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

Имейте в виду, что регулярные выражения хороши для сопоставления шаблонов в строке, но есть много функций, уже предназначенных для работы со строками.

Будет выводить:

а ***

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);
}

Выход:

а *****

1

Другое возможное решение состоит в объединении первых трех символов со строкой * повторил правильное количество раз:

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

Использование max() необходимо, чтобы избежать str_repeat() выдает предупреждение, когда получает отрицательный аргумент. Такая ситуация происходит, когда длина $string меньше 3.

0
По вопросам рекламы [email protected]