プライベート データの一部をアスタリスク (*) に置き換えることにより、単純なデータ マスキング関数を実現しようとしています。JavaScript の文字列置換関数を使用します。
だから私がやったことは次のとおりです:
function privateDataMask(data, options) {
var str = JSON.stringify(data);
var i = 0, len = options.length;
for (i; i < len; i++) {
var opt = options[i];
var key = opt.key;
var reg = opt.reg;
var _reg = new RegExp('"' + key + '":"' + reg.source + '"', 'g'); //To get new reg which includes the key, like /"tel":"(\d{3})(\d*)(\d{4})"/g
str = str.replace(_reg, '"' + key + '":"$1*$3"');
//str = str.replace(_reg, '"' + key + '":"$1' + '*'.repeat($2.length) + '$3",'); //ReferenceError: $2 is not defined
//str = str.replace(_reg, '"' + key + '":"$1' + '*'.repeat(RegExp.$2.length) + '$3",'); //https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp/n
}
return JSON.parse(str);
}
var data = [{
name: "王梅",
tel: "15812346584",
id: "22040219820418866X"
}, {
name: "吴青峰",
tel: "13921345678",
id: "450328197006157868"
},
{
name: "王张玉成",
tel: "17734685988",
id: "620100198109198020"
}
];
var options = [{
key: 'name',
reg: /([\u4e00-\u9fa5A-Za-z0-9\·\.]?)([\u4e00-\u9fa5A-Za-z0-9\·\.]+)([\u4e00-\u9fa5A-Za-z0-9\·\.]+)/
},
{
key: 'tel',
reg: /(\d{3})(\d*)(\d{4})/
},
{
key: 'id',
reg: /(\d{6})(\d*)(\d{5}(\d|X){1})/
}
]
var maskedData = privateDataMask(data, options);
console.log(maskedData);
何とか期待どおりに動作しますが、少し改善したいと思います。たとえば、名前: "吴青峰" -> 名前: "吴*峰"、名前: "王张玉成" -> 名前: "王**成", tel: "15812346584" -> tel: "158****6584" など.
つまり、置換される部分に複数のアスタリスク( ) を追加し、アスタリスク( ) の数は、 String.replace() 中にキャプチャされたグループの長さと等しくする必要があります。
コメント行が示すように、私は '*'.repeat(RegExp.$2.length) のようなことを試しました。パズルは RegExp.$n が String.replace() 関数の終了後にのみ値を取得できることであり、これが誤位置につながります。 .
したがって、 String.replace() 関数中に同時にキャプチャされたグループの長さを取得する方法はありますか?