ユーザー入力(JSコード)を取得し、それらをリアルタイムで実行(処理)して、出力を表示します。
コードにこれらのゼロ幅スペースがある場合があります。それは本当に奇妙です。ユーザーがどのように入力しているのかわかりません。例:"($".length === 3
JSのコードからその文字を削除できるようにする必要があります。どうすればいいですか?または、ブラウザがゼロ幅スペース文字を考慮しないように、そのJSコードを実行する他の方法があるのでしょうか。
ユーザー入力(JSコード)を取得し、それらをリアルタイムで実行(処理)して、出力を表示します。
コードにこれらのゼロ幅スペースがある場合があります。それは本当に奇妙です。ユーザーがどのように入力しているのかわかりません。例:"($".length === 3
JSのコードからその文字を削除できるようにする必要があります。どうすればいいですか?または、ブラウザがゼロ幅スペース文字を考慮しないように、そのJSコードを実行する他の方法があるのでしょうか。
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の制御文字の一部。
一部の非表示の文字がJSONを破損し、予期しないトークンのILLEGAL例外が発生してサイトがクラッシュするという問題がありました。
これがRegExp変数を使用した私の解決策です:
var re = new RegExp("\u2028|\u2029");
var result = text.replace(re, '');
Javascriptとゼロ幅スペースの詳細については、こちらをご覧ください: ゼロ幅スペース
str.replace(/\u200B/g,'');
200Bは、ゼロ幅スペース8203の16進数です。これを空の文字列に置き換えて、これを削除します。
[].filter.call( str, function( c ) {
return c.charCodeAt( 0 ) !== 8203;
} );
各文字をフィルター処理して、8203文字コード(ゼロ幅スペースのUnicode番号)を削除します。
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="[​‌]" />
<input type="button" value="remove zero-width characters" id="submit" />
</form>
(上記のコードスニペットを実行したら、stringToTrim
値とtrimmedString
値をregex101テストウィンドウに貼り付けると、Unicode文字がtrimmedString
値から削除されたことがわかります。)