2017-04-20 1 views
4

J'essaie de masquer une partie d'une chaîne en utilisant JavaScript.Masquer une partie d'une chaîne en utilisant RegExp

par exemple. Masque deuxième et troisième segment du numéro de carte de crédit comme celui-ci en utilisant regex:

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

Je veux juste garder les 4 premiers chiffres et les 5 derniers caractères .

Ceci est ma première tentative: /(?!^.*)[^a-zA-Z\s](?=.{5})/g

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

Répondre

2

Vous pouvez essayer ceci:

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

+0

J'ai fini par combiner votre solution avec mon idée. Je devais le faire avec une expression régulière car l'idée de l'effet est de le voir dans l'événement Keypress. –

-2

Si c'est JavaScript faire le masquage regex, vous avez déjà échoué parce que JS ne devrait jamais besoin de connaître le numéro de carte d'origine, à l'exception lorsque vous venez de le recevoir de l'utilisateur et que vous l'envoyez au serveur pour la première fois, auquel cas vous ne devriez pas le masquer pour que l'utilisateur puisse vérifier les fautes de frappe.

Je ne peux pas vraiment vous aider, vous avez déjà échoué dans le pire des cas.

côté serveur, si le nombre est déjà divisé en espaces *, puis une option est: (en PHP, mais la même idée s'applique à tous)

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

* il ne devrait pas être

+1

À moins que ce Node.js. –

+0

@BrianMcCutchon ... Vous m'avez là-bas. Je m'attendais à une balise [tag: nodejs] si c'était le cas, cependant. –

+0

J'essaye juste de faire un effet de visualisation, le nombre entier de la carte je le garde dans une autre variable. En ce moment j'ai juste besoin de l'expression régulière que je masque comme je l'ai expliqué plus haut. –

0

La réponse satisfait apparemment l'OP. Voici une autre solution en utilisant seulement 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));

Cela garantit que le motif correspond avant d'essayer tout remplacement. Par exemple, dans le troisième cas de test, il renvoie une chaîne vide. Le modèle peut être mis à jour pour correspondre à d'autres modèles de cartes de crédit en plus de ceux indiqués dans la question.

0

Vous pouvez découper les quatre premiers chiffres et appliquer un remplacement pour le reste.

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