2016-03-10 2 views
1

Я пытаюсь что-то вроде этого.php regex заменить каждый символ звездочкой

Скрытие пользователей, за исключением первых трех символов.

EX)

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

настоящее время я использую php следующим образом:

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

и результат будет выглядеть так:

abc* 

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

abc***** 

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

+3

Зачем использовать регулярное выражение для этого ? Вы можете сделать это с помощью некоторой простой логики (подстрока первых трех символов, конкатенированных с строкой «*» длины (str.length - 3)) –

+0

@PeterG разработайте свое предложение в ответ. – axiac

ответ

0

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

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

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

И заменить *. См regex demo

Это регулярное выражение соответствует первые 3 символа (с ^.{3}) или конец предыдущего успешного совпадения или начала строки (с (?!^)\G), а затем опускает символы совпавшие от значения матча (с \K) и соответствует любому символу, но символу новой строки с ..

См IDEONE demo

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

спасибо !! это то, что я действительно хотел! и можете ли вы рассказать мне, что является символами «~» спереди и сзади? Есть ли у php регулярное выражение разные специальные символы? –

+0

'~' [** regex delimiter **] (http://php.net/manual/en/regexp.reference.delimiters.php). Обычно люди используют '/', но я нахожу '' 'лучше, так как нет необходимости в escape-символах'/'в шаблоне. –

3

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

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

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

Выведет:

абв ***

+0

И если вход ['ab'] (https://ideone.com/hmgzpp)? –

+1

@ WiktorStribiżew вы правы, см. Edit;) –

+0

спасибо за решение –

0

Другим возможным решением является конкатенация первые три символа с последовательностью * повторяется нужное количество раз:

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

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

1

Попробуйте эту функцию. Вы можете указать, сколько символы должны быть видимыми и какой символ будет использоваться в качестве маски:

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

Выход:

а *****

Смежные вопросы