Maschera numero di carta di credito in PHP

Ho un numero di carta di credito che voglio mascherare come di seguito:

$cc = 1234123412341234 echo cc_masking($cc) 1234XXXXXXXX1234 function cc_masking($number) {.....} 

Si prega di suggerire l'espressione regolare per questo.

Questo dovrebbe funzionare usando substr :

 function ccMasking($number, $maskingCharacter = 'X') { return substr($number, 0, 4) . str_repeat($maskingCharacter, strlen($number) - 8) . substr($number, -4); } 

È ansible utilizzare substr_replace

 $var = '1234123412341234'; $var = substr_replace($var, str_repeat("X", 8), 4, 8); echo $var; 

Produzione

 1234XXXXXXXX1234 
 <?php echo 'XXXX-XXXX-XXXX-'.substr($cc,-4); ?> 

Supponendo che:

  • I numbers delle carte di credito potrebbero essere contenuti in una string più grande contenente più contenuti
  • Tutte le principali carte di credito vengono verificate utilizzando l'algorithm Luhn https://en.wikipedia.org/wiki/Luhn_algorithm

Questo è ciò che faccio:

  • Rilevo, tramite regex, se una string contiene una catena di cifre, separate o less da spazi e trattini.
  • Per each partita, lo spoglio da valori non numbersci e controllo se è un Luhn valido.
  • Sostituisci la parte che voglio, per each partita, con caratteri sostitutivi (di solito "*").

Il codice è questo:

 public function mask($string) { $regex = '/(?:\d[ \t-]*?){13,19}/m'; $matches = []; preg_match_all($regex, $string, $matches); // No credit card found if (!isset($matches[0]) || empty($matches[0])) { return $string; } foreach ($matches as $match_group) { foreach ($match_group as $match) { $stripped_match = preg_replace('/[^\d]/', '', $match); // Is it a valid Luhn one? if (false === $this->_util_luhn->isLuhn($stripped_match)) { continue; } $card_length = strlen($stripped_match); $replacement = str_pad('', $card_length - 4, $this->_replacement) . substr($stripped_match, -4); // If so, replace the match $string = str_replace($match, $replacement, $string); } } return $string; } 

Vedrai una chiamata a $ this -> _ util_luhn-> isLuhn, che è una function che fa questo:

 public function isLuhn($input) { if (!is_numbersc($input)) { return false; } $numbersc_string = (string) preg_replace('/\D/', '', $input); $sum = 0; $numDigits = strlen($numbersc_string) - 1; $parity = $numDigits % 2; for ($i = $numDigits; $i >= 0; $i--) { $digit = substr($numbersc_string, $i, 1); if (!$parity == ($i % 2)) { $digit <<= 1; } $digit = ($digit > 9) ? ($digit - 9) : $digit; $sum += $digit; } return (0 == ($sum % 10)); } 

È come l'ho implementato in https://github.com/pachico/magoo/ . Spero che tu lo trovi utile

Non c'è bisogno di espressioni regolari per questo. Basta prendere n numbers all'inizio, n numbers alla fine quindi aggiungere la X al centro per completare.

Con espressione regolare

  preg_replace( '/^(....).*(....)$/', '\1XXXXXXXX\2', $cc ); 

Non è il modo elegante ma funziona

 <?php $cc = "1234123412341234"; function cc_masking($number) { $int_first = 4; $int_last = 4; $chars = strlen($number); $repeater = "x"; $repeates = $chars-$int_first-$int_last; // echo "<p>Org: $number</p>"; $mask = substr($number,0,4).str_repeat($repeater,$repeates).substr($cc,-4); // echo "<p>Mask: $mask"; return $mask; } echo cc_masking($cc); ?> 

I miei 5 centesimi.

Esempi:
371449635398431 => XXX-XXXX-XXXX-8431
4111111111111111 => XXXX-XXXX-XXXX-1111

 public function maskCreditCardNumber($cc, $maskFrom = 0, $maskTo = 4, $maskChar = 'X', $maskSpacer = '-') { // Clean out $cc = str_replace(arrays('-', ' '), '', $cc); $ccLength = strlen($cc); // Mask CC number if (empty($maskFrom) && $maskTo == $ccLength) { $cc = str_repeat($maskChar, $ccLength); } else { $cc = substr($cc, 0, $maskFrom) . str_repeat($maskChar, $ccLength - $maskFrom - $maskTo) . substr($cc, -1 * $maskTo); } // Format if ($ccLength > 4) { $newCreditCard = substr($cc, -4); for ($i = $ccLength - 5; $i >= 0; $i--) { // If on the fourth character add the mask char if ((($i + 1) - $ccLength) % 4 == 0) { $newCreditCard = $maskSpacer . $newCreditCard; } // Add the current character to the new credit card $newCreditCard = $cc[$i] . $newCreditCard; } } else { $newCreditCard = $cc; } return $newCreditCard; } 
 $accNum = "1234123412341234"; $accNum1 = substr($accNum,2,2); $accNum1 = '**'.$accNum1; $accNum2 = substr($accNum,6,100); $accNum2 = '**'.$accNum2; $accNum = $accNum1.$accNum2; echo $accNum;