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 并导致Unexpected Token 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 的十六进制。用空字符串替换它以删除它

于 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 中执行此操作,请尝试此 regex

/([\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 回答