маскирование информации о кредитной карте и банковском счете

#php #zend-framework #zend-view

#php #zend-framework #zend-просмотр

Вопрос:

Я ищу функцию php, которая может маскировать информацию о кредитной карте и банке, такую как номер маршрута и номера счетов. Мне нужно замаскировать много форматов, поэтому существующие ответы stack overflow мне не очень помогают.

Так, например, если входные данные есть 304-443-2456 , функция должна вернуть xxx-xxx-2456 . Иногда число имеет тире и может иметь различную длину.

Я ищу что-то общее, что я могу расширить по мере необходимости, предпочтительно вспомогательный класс представления zend framework.

Комментарии:

1. Каковы ваши критерии маскировки? Все, кроме последних 4 цифр?

2. да, все числа, кроме 4 последних цифр. Иногда длина чисел может меняться

Ответ №1:

Какое-то небольшое регулярное выражение в собственной функции, доступна конфигурация:

 $number = '304-443-2456';

function mask_number($number, $count = 4, $seperators = '-')
{
    $masked = preg_replace('/d/', 'x', $number);
    $last = preg_match(sprintf('/([%s]?d){%d}$/', preg_quote($seperators),  $count), $number, $matches);
    if ($last) {
        list($clean) = $matches;
        $masked = substr($masked, 0, -strlen($clean)) . $clean;
    }
    return $masked;
}

echo mask_number($number); # xxx-xxx-2456
  

Если функция завершится с ошибкой, она вернет все замаскированные (например, другой разделитель, менее 4 цифр и т. Д.). Можно сказать, Что вы можете использовать некоторую защиту от детей.

ДЕМОНСТРАЦИЯ

Комментарии:

1. Спасибо! это именно та функция, которую я искал. он также обрабатывает дополнительные разделители, что мне тоже очень помогает

2. Если это ровно 4 цифры, он вернет значение без маски. Следует добавить проверку для этого!

Ответ №2:

 <?php

function ccmask($cc, $char = '#') {
    $pattern = '/^([0-9-] )([0-9]*)$/U';
    $matches = array();
    preg_match($pattern, $cc, $matches);
    return preg_replace('([0-9])', $char, $matches[1]).$matches[2];
}

echo ccmask('304-443-2456'), "n";  
echo ccmask('4924-7921-9900-9876', '*'), "n";  
echo ccmask('30-43-56', 'x'), "n";  
  

Выводит:

 ###-###-2456
****-****-****-9876
xx-xx-56
  

Ответ №3:

Для этого я использую помощник просмотра. Я стараюсь избегать регулярных выражений, хотя мне всегда требуется время, чтобы понять, что он делает, особенно если я вернусь к коду через некоторое время.

 class Zend_View_Helper_Ccmask
{
    public function ccmask($ccNum)
    {
        $maskArray = explode('-', $ccNum);
        $sections = count($maskArray) - 1;
        for($i = 0; $i < $sections ; $i  ){
            $maskArray[$i] = str_replace(array(1,2,3,4,5,6,7,8,9,0), 'x', $maskArray[$i]);
        }
        return implode('-', $maskArray);
    }
}
  

На ваш взгляд

 echo $this->ccmask('304-443-2456');
//output = xxx-xxx-2456
  

Ответ №4:

Хороший способ взглянуть на это — посмотреть, что не будет замаскировано, и вывести xs для всего остального. Простое и недорогое решение:

 function cc_mask( $cc_raw, $unmask_count ){
 $cc_masked = '';
 for( $i=0; $i < ( strlen( $cc_raw ) - $unmask_count ) ; $i   ){
  //If you want to maintain hyphens and special characters
  $char = substr( $cc_raw, $i, 1 );
  $cc_masked .= ctype_digit( $char ) ? "*" : $char;
 }
$cc_masked .= substr( $cc_raw ,  -$unmask_count );
 return $cc_masked;

}

echo cc_mask("304-443-2456",4);

//Output
***-***-2456
  

Было бы еще быстрее, если бы не было необходимости поддерживать дефисы и специальные символы