使用RegExp屏蔽String的一部分

时间:2017-04-20 16:18:14

标签: javascript regex mask credit-card

我试图使用JavaScript屏蔽字符串的一部分。

e.g。使用正则表达式掩盖信用卡号码的第二和第三段:

  • 4567 6365 7987 37834567 **** **** 3783
  • 3457 732837 823723457 ****** 82372

我只想保留前4个数字和最后5个字符。

这是我的第一次尝试:/(?!^.*)[^a-zA-Z\s](?=.{5})/g

  

https://regex101.com/r/ZBi54c/2

5 个答案:

答案 0 :(得分:2)

你可以试试这个:

var cardnumber = '4567 6365 7987 3783';
var first4 = cardnumber.substring(0, 4);
var last5 = cardnumber.substring(cardnumber.length - 5);

mask = cardnumber.substring(4, cardnumber.length - 5).replace(/\d/g,"*");
console.log(first4 + mask + last5);

答案 1 :(得分:0)

答案显然满足了OP。这是另一种仅使用Regexes的解决方案:



function starry(match, gr1, gr2, gr3) {
  var stars = gr2.replace(/\d/g, '*');
  return gr1 + " " + stars + " " + gr3;
}

function ccStarry(str) {
  var rex = /(\d{4})\s(\d{4}\s\d{4}|\d{6})\s(\d{4}|\d{5})/;

  if (rex.test(str))
    return str.replace(rex, starry);
  else return "";
}


var s1 = "4567 6365 7987 3783";
var s2 = "3457 732837 82372";
var s3 = "dfdfdf";
console.log(ccStarry(s1));
console.log(ccStarry(s2));
console.log(ccStarry(s3));




这可确保在尝试任何替换之前模式匹配。例如,在第三个测试用例中,它返回一个空字符串。除了问题中给出的模式之外,可以更新模式以匹配其他信用卡模式。

答案 2 :(得分:0)

您可以对前四位进行切片并为其余数字应用替换。



console.log(
    ['4567 6365 7987 3783', '3457 732837 82372'].map(
        s => s.slice(0, 4) + s.slice(4).replace(/\d(?=.* )/g, '*')
    )
);




答案 3 :(得分:0)

我想详细说明@Nina Scholz 的回答,我在以下示例代码中使用 .slice() 来屏蔽 2 个条件下的变量。

  1. 只是一个简单的变量 var n = '12345567890'
  2. 数组对象

// Single number
var n = '601115558888';
var singleNumber = n.slice(0, 4) + n.slice(4, n.length -4).replace(/\d/g,'*') + n.slice(n.length -4);
console.log(singleNumber);

// array of object
var obj = [{
  contacts_name: 'Jason',
  contacts_num : '651231239991'
},
{
  contacts_name: 'King',
  contacts_num : '60101233321'
}];

// Mask for the middle number, showing the first4 number and last4 number
// and replace the rest number with *
var num = obj.map((element, index) =>
  element.contacts_num.slice(0,4) 
   + element.contacts_num.slice(4, element.contacts_num.length-4).replace(/\d/g, '*')
   + element.contacts_num.slice(element.contacts_num.length -4)
);

console.log(num);

答案 4 :(得分:-2)

如果是正在执行正则表达式屏蔽的JavaScript,那么您已经失败了,因为JS应该永远不需要知道原始卡号,除非您刚从用户那里收到它并且是第一次将它发送到服务器,在这种情况下你不应该掩盖它,所以用户可以检查拼写错误。

我无法真正帮助你,你已经以最坏的方式失败了。

服务器端,如果数字已经分成空格*,那么一个选项是:(在PHP中,但同样的想法适用于所有)

$parts = explode(" ",$fullnumber);
$first = array_shift($parts);
$last = array_pop($parts);
$middle = implode(" ",$parts);
$mask = preg_replace("/\d/","*",$middle);
$result = "$first $mask $last";

*它不应该是