屏蔽信用卡号码

时间:2011-08-18 16:33:04

标签: php

在PHP中屏蔽信用卡号码的最佳方法是什么?

信用卡号码无须有效。所以不需要做Luhn算法。只要它与模式匹配,就用XXXXXXXX替换它。

到目前为止我所拥有的:

<?php

$str = "The quick brown fox jumps over 5192696222257727 dog.";

$credit_card_re = '/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|622((12[6-9]|1[3-9][0-9])|([2-8][0-9][0-9])|(9(([0-1][0-9])|(2[0-5]))))[0-9]{10}|64[4-9][0-9]{13}|65[0-9]{14}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})*$/';

6 个答案:

答案 0 :(得分:7)

$cc = "6789765435678765";
$cc = str_pad(substr($cc, -4), strlen($cc), '*', STR_PAD_LEFT);

答案 1 :(得分:2)

正则表达式可以正常工作,所以你拥有的很好。

要实际执行正则表达式,请使用以下代码:

$str = "The quick brown fox jumps over 5192696222257727 dog.";

$masked = preg_replace("/(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\d{3})\d{11})/", "XXXXXXXX", $str);

然后你可以用$masked做任何事情。

编辑:修正了正则表达式,如果整个字符串都是数字,则只匹配它。

答案 2 :(得分:0)

http://www.php.net/manual/en/function.preg-replace.php

<?php

$str = "The quick brown fox jumps over 5192696222257727 dog.";

$pattern = '/^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|6011[0-9]{12}|622((12[6-9]|1[3-9][0-9])|([2-8][0-9][0-9])|(9(([0-1][0-9])|(2[0-5]))))[0-9]{10}|64[4-9][0-9]{13}|65[0-9]{14}|3(?:0[0-5]|[68][0-9])[0-9]{11}|3[47][0-9]{13})*$/';

$str = preg_replace($pattern , 'XXXXXXXX' , $str);

?或者我不理解你?

答案 3 :(得分:0)

<?php
    function mask ( $str, $start = 0, $length = null ) {
        $mask = preg_replace ( "/\S/", "*", $str );
        if ( is_null ( $length )) {
            $mask = substr ( $mask, $start );
            $str = substr_replace ( $str, $mask, $start );
        } else {
            $mask = substr ( $mask, $start, $length );
            $str = substr_replace ( $str, $mask, $start, $length );
        }
        return $str;
    }
?>

here

答案 4 :(得分:0)

无正则表达式解决方案,适用于任何长度字符串,仅显示最后4:

function mask_cc( $number )  {

    return  substr_replace($number, str_repeat('X', strlen( $number ) - 4), 0, strlen( $number ) - 4);

}

答案 5 :(得分:-1)

<?php
function get_masked_card_no($card_no="", $mask_cha = "X", $mask_length=4, $mask_sep=" ")
{ 
    if($card_no != "")
    {
        $mask_text = "";
        for($i=0; $i<$mask_length; $i++)
        {
            $mask_text.=$mask_cha;
        }

        $card_no = str_replace($mask_text, $mask_text.$mask_sep, str_repeat($mask_cha, strlen($card_no) - 4)) .$mask_sep. substr($card_no, strlen($card_no)-4, 4);
    }

    return $card_no;
}

$card_no = "2222111133339876";

echo get_masked_card_no($card_no, "X", 4, " ");

/*
Answer will be
XXXX XXXX XXXX 9876
*/
?>