【问题标题】:Masking credit card number屏蔽信用卡号
【发布时间】:2017-10-27 17:06:37
【问题描述】:

在 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})*$/';

【问题讨论】:

  • 好的。我把正则表达式和开头的'/^弄错了。

标签: php


【解决方案1】:
$cc = "6789765435678765";
$cc = str_pad(substr($cc, -4), strlen($cc), '*', STR_PAD_LEFT);

【讨论】:

    【解决方案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做任何事情。

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

    【讨论】:

      【解决方案3】:

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

      function mask_cc( $number )  {
      
          return  substr_replace($number, str_repeat('X', strlen( $number ) - 4), 0, strlen( $number ) - 4);
      
      }
      

      【讨论】:

        【解决方案4】:

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

        ?还是我听不懂?

        【讨论】:

        • 这行不通。 preg_replace 作用于整个字符串而不是字符串中的单个单词。
        • @雅达:嗯?什么意思?
        • @Yada:我明白了。不是 preg_replace 不起作用。这是你的模式:)
        【解决方案5】:
        <?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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-12-25
          • 2011-11-20
          • 2023-03-13
          • 2017-10-19
          • 2011-11-11
          • 2018-08-13
          相关资源
          最近更新 更多