web-dev-qa-db-fra.com

JavaScript supprime ZERO WIDTH SPACE (unicode 8203) de la chaîne

J'écris du javascript qui traite le contenu du site Web. Mes efforts sont contrecarrés par la tendance de l'éditeur de texte SharePoint à insérer le caractère "espace zéro largeur" ​​dans le texte lorsque l'utilisateur appuie sur la touche Retour arrière. La valeur unicode du caractère est 8203, ou B200 en hexadécimal. J'ai essayé d'utiliser la fonction par défaut "remplacer" pour m'en débarrasser. J'ai essayé plusieurs variantes, aucune d'entre elles n'a fonctionné:

var a = "o​m"; //the invisible character is between o and m

var b = a.replace(/\u8203/g,'');
= a.replace(/\uB200/g,'');
= a.replace("\\uB200",'');

et ainsi de suite. J'ai essayé pas mal de variations sur ce thème. Aucune de ces expressions ne fonctionne (testé dans Chrome et Firefox) La seule chose qui fonctionne est de taper le caractère réel dans l'expression:

var b = a.replace("​",''); //it's there, believe me

Cela pose des problèmes potentiels. Le personnage est invisible, donc cette ligne en soi n'a pas de sens. Je peux contourner cela avec des commentaires. Mais si le code est réutilisé et que le fichier est enregistré à l'aide d'un codage non Unicode (ou lorsqu'il est déployé sur SharePoint, rien ne garantit qu'il ne gâchera pas le codage), il ne fonctionnera plus. Existe-t-il un moyen d'écrire cela en utilisant la notation Unicode au lieu du caractère lui-même?

[Mes divagations sur le personnage]

Au cas où vous n'auriez pas rencontré ce personnage (et vous ne l'avez probablement pas fait, vu que c'est invisible à l'œil nu, à moins que le code ne soit cassé et que vous l'avez découvert en essayant de localiser le bogue), c'est un vrai trou qui entraînera un dysfonctionnement de certains types de correspondance de motif. J'ai mis en cage la bête pour vous:

[] <- Attention, ne le laissez pas s'échapper. 

Si vous voulez le voir, copiez ces crochets dans un éditeur de texte, puis parcourez-le avec votre curseur. Vous remarquerez que vous aurez besoin de trois étapes pour passer ce qui semble être 2 caractères, et votre curseur sautera une étape au milieu.

16
Shaggydog

Le nombre dans un échappement Unicode doit être au format hexadécimal, et le numéro hexadécimal de 8203 est 200B (ce qui est en fait un espace Unicode de largeur nulle ), ainsi:

var b = a.replace(/\u200B/g,'');

Exemple en direct :

var a = "o​m"; //the invisible character is between o and m
var b = a.replace(/\u200B/g,'');
console.log("a.length = " + a.length);      // 3
console.log("a === 'om'? " + (a === 'om')); // false
console.log("b.length = " + b.length);      // 2
console.log("b === 'om'? " + (b === 'om')); // true
23
T.J. Crowder

La réponse acceptée n'a pas fonctionné pour mon cas. 

Mais celui-ci a:

text.replace(/(^[\s\u200b]*|[\s\u200b]*$)/g, '')
1
Adrian Rosca