2016-03-10 53 views
1

我想這樣的事情。PHP的正則表達式替換每個字符的星號

隱藏除前3個字符以外的用戶。

EX)

  • 蘋果 - >應用程序**
  • 谷歌 - >咕***
  • 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

'〜'是一個[**正則表達式分隔符**](http://php.net/manual/en/regexp.reference.delimiters.php)。通常,人們使用'/',但是我發現'〜'更好,因爲模式中不需要轉義符號'/'。 –

3

不要使用正則表達式,使用substr_replace

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

請記住,正則表達式是良好的字符串匹配模式,但有一個已經爲字符串操作設計的函數

將輸出:

ABC ***

+0

如果輸入是['ab'](https://ideone.com/hmgzpp)? –

+1

@WiktorStribiżew你是對的,請參閱編輯;) –

+0

感謝解決方案 –

0

另一種可能的解決方案是將前三個字符與*串串聯重複正確的次數:

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

需要使用max()以避免str_repeat()在收到陰性信號時發出警告一個論點。當$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); 
} 

輸出:

ABC *****