我正在寻找一个可以屏蔽信用卡和功能的PHP功能。银行信息,如路由号码和帐号。我需要掩盖许多格式,因此现有的堆栈溢出答案对我没那么大帮助。
因此,例如,如果输入为304-443-2456
,则函数应返回xxx-xxx-2456
。
有时这个数字有破折号,可以有不同的长度。
我正在寻找一些通用的东西,我可以根据需要进行扩展,最好是一个zend框架视图助手类。
答案 0 :(得分:2)
它所拥有的函数中的一些小正则表达式,配置可用:
$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 :(得分:1)
<?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
答案 2 :(得分:1)
我使用了一个视图助手。我倾向于避免正则表达式,因为它总是需要我很长时间才能弄清楚它的作用,特别是如果我在一段时间后回到代码中。
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
答案 3 :(得分:0)
看待这个问题的一个好方法是不被屏蔽并为其他所有内容输出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
如果不需要维护连字符和特殊字符,那么会更快