php
2011-08-18 388 views 1 likes 
1

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

確定。我在正式快報和'/ ^開始時犯了一個錯誤。 – Yada

回答

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

編輯:修正了正則表達式,你只匹配它,如果整個字符串是數字。

+0

preg_replace在這種情況下不起作用。 – Yada

+0

它不工作的方式? – jli

+0

對不起,修復了正則表達式,現在應該可以正常工作了。 – jli

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

?或者我不理解你?

+0

這不行。 preg_replace作用於整個字符串而不是字符串中的單個單詞。 – Yada

+0

@Yada:嗯?你什麼意思? – PeeHaa

+0

@Yada:nvm我明白了。這不是preg_replace哪個不行。這是你的模式:) – PeeHaa

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

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

一個沒有正則表達式的解決方案,對於任何長度的字符串的作品,只顯示最後4:

function mask_cc($number) { 

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

} 
0
<?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 
*/ 
?> 
+2

您的描述看起來不完整。請描述您的代碼如何回答問題 –

+0

歡迎使用StackOverflow。儘管此代碼片段可能是解決方案,但[包括解釋](// meta.stackexchange.com/questions/114762/explaining-entirely-基於代碼的答案)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – yivi

相關問題