Я пытаюсь что-то вроде этого.
Скрытие пользователей кроме первых 3 символов.
EX)
В настоящее время я использую 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
) и соответствует любому символу, кроме новой строки с .
,
Увидеть 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;
}
Не используйте регулярные выражения, используйте substr_replace:
$var = "abcdef";
$charToKeep = 3;
echo strlen($var) > $charToKeep ? substr_replace($var, str_repeat ( '*' , strlen($var) - $charToKeep), $charToKeep) : $var;
Имейте в виду, что регулярные выражения хороши для сопоставления шаблонов в строке, но есть много функций, уже предназначенных для работы со строками.
Будет выводить:
а ***
Попробуйте эту функцию. Вы можете указать, сколько символов должно быть видно и какой символ должен использоваться в качестве маски:
$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);
}
Выход:
а *****
Другое возможное решение состоит в объединении первых трех символов со строкой *
повторил правильное количество раз:
$text = substr($string, 0, 3).str_repeat('*', max(0, strlen($string) - 3));
Использование max()
необходимо, чтобы избежать str_repeat()
выдает предупреждение, когда получает отрицательный аргумент. Такая ситуация происходит, когда длина $string
меньше 3.