【问题标题】:Mask a portion of a String using RegExp使用 RegExp 屏蔽字符串的一部分
【发布时间】:2017-09-17 09:38:37
【问题描述】:

我正在尝试使用 JavaScript 屏蔽字符串的一部分。

例如像这样使用正则表达式屏蔽信用卡号的第二和第三段:

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

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

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

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

【问题讨论】:

    标签: javascript regex mask credit-card


    【解决方案1】:

    你可以试试这个:

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

    【讨论】:

    • 我最终将您的解决方案与我的想法结合起来。我需要用正则表达式来做,因为效果的想法是在 Keypress 事件中看到它。
    【解决方案2】:

    您可以分割前四位数字并应用替换其余数字。

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

    【讨论】:

      【解决方案3】:

      答案显然满足 OP。这是另一种仅使用正则表达式的解决方案:

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

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

      【讨论】:

        【解决方案4】:

        我想详细说明@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);

        【讨论】:

          【解决方案5】:

          如果是 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";
          

          * 它不应该是

          【讨论】:

          • 除非是 node.js。
          • @BrianMcCutchon ...你让我到​​了那里。但是,如果是这样的话,我会期待一个nodejs 标签。
          • 我只是想做一个可视化的效果,卡片的整数我把它保存在另一个变量中。现在我只需要上面解释过的正则表达式。
          • @JosueSoriano 不过,您应该澄清一下。你在客户端这样做吗?如果是这样,Niet 的观点就成立了。
          猜你喜欢
          • 2014-09-07
          • 2012-02-20
          • 2017-10-27
          • 2013-06-27
          • 2020-01-09
          • 2017-12-15
          • 2023-03-31
          • 2016-12-06
          • 2016-12-17
          相关资源
          最近更新 更多