0

プライベート データの一部をアスタリスク (*) に置き換えることにより、単純なデータ マスキング関数を実現しようとしています。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() 関数中に同時にキャプチャされたグループの長さを取得する方法はありますか?

4

1 に答える 1

1

2 番目のパラメーターとして関数を.replace()に渡すことができ、その関数は*追加される量を計算します。

_str = _str.replace(_reg, (text, start, middle, end) => `"${key}":"${start + '*'.repeat(middle.length) + end}"`);

デモ:

    function privateDataMask(data, options) {
        var str = JSON.stringify(data);
        var i = 0;
        var len = options.length;
        var _str, _data;
        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
          //console.log(_reg);
          if (!_str) {
            _str = str;
          }
          _str = _str.replace(_reg, (text, start, middle, end) => `"${key}":"${start + '*'.repeat(middle.length) + end}"`);
        }
        _data = JSON.parse(_str);
        return _data;
      }
      
      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);

于 2019-08-28T10:21:07.257 に答える