web-dev-qa-db-ja.com

JavaScriptは文字列からZERO WIDTH SPACE(Unicode 8203)を削除します

ウェブサイトのコンテンツを処理するJavaScriptを書いています。ユーザーがBackspaceキーを押したときに、テキストに「幅がゼロのスペース」文字を挿入するというSharePointテキストエディターの傾向によって、私の取り組みが妨げられています。文字のユニコード値は8203、または16進数のB200です。私はそれを取り除くためにデフォルトの "replace"関数を使用しようとしました。私は多くの亜種を試しましたが、どれもうまくいきませんでした:

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

などなど。私はこのテーマでかなりの数のバリエーションを試しました。これらの式はどれも機能しません(ChromeおよびFirefoxでテスト済み)。機能するのは、式に実際の文字を入力することだけです。

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

これは潜在的な問題を引き起こします。文字自体は見えないので、線自体は意味がありません。コメントでそれを回避できます。ただし、コードが再利用され、ファイルが非Unicodeエンコーディングを使用して保存された場合(またはSharePointにデプロイされた場合、エンコーディングがめちゃくちゃにならないという保証はありません)、機能しなくなります。文字自体の代わりにユニコード表記を使用してこれを書く方法はありますか?

[キャラクターに関するとりとめのない]

あなたがこのキャラクターに会っていない場合(そして、あなたがコードを壊してバグを見つけようとしたときにそれを発見しなかった場合を除いて、肉眼では見えないので、おそらくあなたは会っていないでしょう)、それは本当の穴です特定のタイプのパターンマッチングが誤動作します。私はあなたのために獣を檻に入れました:

[] <-注意、脱出させないでください。

表示したい場合は、それらのブラケットをテキストエディタにコピーしてから、カーソルをそれらに繰り返します。 2文字のように渡すには3つのステップが必要で、カーソルが途中のステップをスキップすることに気づくでしょう。

19
Shaggydog

Unicodeエスケープの数値は16進数である必要があり、8203の16進数は200Bです(これは実際には nicodeゼロ幅スペース です)。

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

実例

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
25
T.J. Crowder

受け入れられた答えは私の場合うまくいきませんでした。

しかし、これはそうしました:

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