Номер кредитной карты маски в PHP

У меня есть номер кредитной карты, который я хочу замаскировать, как показано ниже:

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

Пожалуйста, предложите регулярное выражение для этого.

Solutions Collecting From Web of "Номер кредитной карты маски в PHP"

Это должно работать с использованием substr :

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

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

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

Вывод

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

При условии, что:

  • Номера кредитных карт могут содержаться в большей строке, содержащей больше контента
  • Все основные кредитные карты проверяются суммой с использованием алгоритма Luhn https://en.wikipedia.org/wiki/Luhn_algorithm

Вот что я делаю:

  • Я обнаруживаю через регулярное выражение, если строка содержит целую цепочку цифр, разделенных или нет пробелами и дефисом.
  • Для каждого совпадения я удаляю его из нечисловых значений и проверяю, действительно ли это Luhn.
  • Замените часть, которую я хочу, для каждого матча, с заменяющими символами (обычно «*»).

Код выглядит так:

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

Вы увидите вызов $ this -> _ util_luhn-> isLuhn, который выполняет функцию:

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

Именно так я реализовал его в https://github.com/pachico/magoo/ . Надеюсь, вы найдете ее полезной.

Для этого нет необходимости в регулярном выражении. Просто возьмите n чисел в начале, n чисел в конце, затем добавьте X в середине, чтобы завершить.

С регулярным выражением

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

Не изящный способ, но он работает

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

Мои 5 центов.

Примеры:
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(array('-', ' '), '', $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;