2014-06-13 14 views
9

Sto scrivendo qualche javascript che elabora il contenuto del sito. I miei sforzi vengono sventati dalla tendenza dell'editor di testo di SharePoint a inserire il carattere "spazio di larghezza zero" nel testo quando l'utente preme backspace. Il valore unicode del carattere è 8203 o B200 in esadecimale. Ho provato a usare la funzione predefinita "replace" per sbarazzarmene. Ho provato molte varianti, nessuna delle quali funzionava:JavaScript remove ZERO WIDTH SPACE (unicode 8203) dalla stringa

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",''); 

e così via e così via. Ho provato diverse varianti su questo tema. Nessuna di queste espressioni lavoro (testato in Chrome e Firefox) L'unica cosa che funziona sta scrivendo il carattere effettivo nell'espressione:

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

Questo pone problemi potenziali. Il personaggio è invisibile, quindi quella linea in sé non ha senso. Posso aggirarlo con i commenti. Ma se il codice viene mai riutilizzato e il file viene salvato utilizzando la codifica non Unicode, (o quando viene distribuito in SharePoint, non è garantito che non comprometterà la codifica) smetterà di funzionare. C'è un modo per scrivere questo usando la notazione Unicode invece del carattere stesso?

[mie divagazioni sul personaggio]

Nel caso in cui non si sono incontrati questo personaggio, (e probabilmente non hanno, visto che è invisibile ad occhio nudo, a meno che non si è rotto il codice e si scoprì mentre cerca di localizzare il bug) è un vero buco che causerà il malfunzionamento di alcuni tipi di pattern matching. Ho messo in gabbia la bestia per te:

[] < - attento, non lasciarlo scappare.

Se si desidera visualizzarlo, copiare le parentesi in un editor di testo e quindi scorrere il cursore attraverso di esse. Noterai che avrai bisogno di tre passaggi per passare ciò che sembra 2 caratteri e il tuo cursore salterà un passaggio nel mezzo.

risposta

17

Il numero in una fuga unicode dovrebbe essere in esadecimale, e l'esagono per 8203 è 200B (che è in effetti un Unicode zero-width space), quindi:

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

Live Example:

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 
+0

Grazie, sei un risparmiatore di vita! – jaggedsoft

1

La accettata la risposta non ha funzionato per il mio caso.

ma questo fatto:

text.replace(/(^[\s\u200b]*|[\s\u200b]*$)/g, '') 
Problemi correlati