80

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

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

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

4

5 に答える 5

144

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の制御文字の一部。

于 2012-07-03T06:58:01.740 に答える
10

一部の非表示の文字がJSONを破損し、予期しないトークンのILLEGAL例外が発生してサイトがクラッシュするという問題がありました。

これがRegExp変数を使用した私の解決策です:

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

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

于 2014-10-19T13:50:22.807 に答える
5
str.replace(/\u200B/g,'');

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

于 2016-07-26T12:50:14.820 に答える
4
[].filter.call( str, function( c ) {
    return c.charCodeAt( 0 ) !== 8203;
} );

各文字をフィルター処理して、8203文字コード(ゼロ幅スペースのUnicode番号)を削除します。

于 2012-07-03T06:54:12.853 に答える
0

JavaScriptでこれを実行しようとしている場合は、この正規表現を試してください。

/([\u200B]+|[\u200C]+|[\u200D]+|[\u200E]+|[\u200F]+|[\uFEFF]+)/g

submit.onclick = evt => {
  const stringToTrim = stringValue.value;
  zeroWidthTrim(stringToTrim);
}

/**
 * Given a string, when it has zero-width spaces in it, then remove them
 *
 * @param {String} stringToTrim The string to be trimmed of unicode spaces
 *
 * @return the trimmed string
 *
 * Regex for zero-width space Unicode characters.
 *
 * U+200B zero-width space.
 * U+200C zero-width non-joiner.
 * U+200D zero-width joiner.
 * U+200E left-to-right mark.
 * U+200F right-to-left mark.
 * U+FEFF zero-width non-breaking space.
 */
function zeroWidthTrim(stringToTrim) {
  const ZERO_WIDTH_SPACES_REGEX = /([\u200B]+|[\u200C]+|[\u200D]+|[\u200E]+|[\u200F]+|[\uFEFF]+)/g;
  console.log('stringToTrim = ' + stringToTrim);
  const trimmedString = stringToTrim.replace(ZERO_WIDTH_SPACES_REGEX, '');
  console.log('trimmedString = ' + trimmedString);
  return trimmedString;
};
<form runat="server">
  <input name="stringValue" id="stringValue" type="text" placeholder="enter your string" value="[&#x200b;&#x200c;]" />
  <input type="button" value="remove zero-width characters" id="submit" />
</form>

(上記のコードスニペットを実行したら、stringToTrim値とtrimmedString値をregex101テストウィンドウに貼り付けると、Unicode文字がtrimmedString値から削除されたことがわかります。)

于 2022-01-06T21:44:29.527 に答える