web-dev-qa-db-ja.com

JavaScript文字列からゼロ幅のスペース文字を削除する

ユーザー入力(JSコード)を取得し、リアルタイムで実行(処理)して出力を表示します。

コードに幅ゼロのスペースがある場合がありますが、本当に奇妙です。ユーザーがそれをどのように入力しているかわかりません。例-「(​$".length === 3

JSのコードからその文字を削除できるようにする必要があります。どうすればいいですか?または、ブラウザがゼロ幅スペース文字を考慮しないように、JSコードを実行する他の方法がありますか?

53
user1437328

Unicodeには次のゼロ幅文字があります。

  • U + 200Bゼロ幅スペース
  • U + 200Cゼロ幅の非結合Unicodeコードポイント
  • U + 200Dゼロ幅ジョイナーUnicodeコードポイント
  • U + FEFFゼロ幅のノーブレークスペースUnicodeコードポイント

JavaScriptの文字列からそれらを削除するには、単純な正規表現を使用できます。

var userInput = 'a\u200Bb\u200Cc\u200Dd\uFEFFe';
console.log(userInput.length); // 9
var result = userInput.replace(/[\u200B-\u200D\uFEFF]/g, '');
console.log(result.length); // 5

表示されない可能性のある記号がさらにたくさんあることに注意してください。一部の ASCIIの制御文字 など。

89
Mathias Bynens

目に見えない文字がJSONを破壊し、予期しないトークンILLEGAL例外を引き起こしてサイトをクラッシュさせる問題がありました。

RegExp変数を使用した私のソリューションは次のとおりです。

    var re = new RegExp("\u2028|\u2029");
    var result = text.replace(re, '');

JavaScriptとゼロ幅スペースの詳細については、こちらをご覧ください。 ゼロ幅スペース

8
Technotronic
str.replace(/\u200B/g,'');

200Bは、ゼロ幅スペース8203の16進数です。これを削除するには、空の文字列に置き換えます。

[].filter.call( str, function( c ) {
    return c.charCodeAt( 0 ) !== 8203;
} );

各文字をフィルタリングして、8203文字コード(ゼロ幅スペースのユニコード番号)を削除します。

1