У меня есть номер кредитной карты, который я хочу замаскировать, как показано ниже:
$cc = 1234123412341234 echo cc_masking($cc) 1234XXXXXXXX1234 function cc_masking($number) {.....}
Пожалуйста, предложите регулярное выражение для этого.
Это должно работать с использованием 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); ?>
При условии, что:
Вот что я делаю:
Код выглядит так:
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;