从 JavaScript 字符串中删除零宽度空格字符

Remove zero-width space characters from a JavaScript string

本文关键字:空格 字符 删除 JavaScript 字符串      更新时间:2023-09-26

我获取用户输入(JS代码)并实时执行(处理)它们以显示一些输出。

有时代码有那些零宽度的空格;这真的很奇怪。我不知道用户是如何输入的。示例:"(​$".length === 3

我需要能够在 JS 中的代码中删除该字符。我该怎么做?或者也许还有其他方法可以执行该JS代码,以便浏览器不考虑零宽度的空格字符?

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 的一些控制字符。

我遇到了一个问题,一些不可见的字符损坏了我的JSON,并导致意外的令牌非法异常,导致我的网站崩溃。

这是我使用正则表达式变量的解决方案:

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

更多关于Javascript和零宽度空格的信息,你可以在这里找到:零宽度空间

str.replace(/'u200B/g,'');

200B 是零宽度空间 8203 的十六进制。 将其替换为空字符串以删除此

[].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="[&#x200b;&#x200c;]" />
  <input type="button" value="remove zero-width characters" id="submit" />
</form>

(运行上述代码片段后,将stringToTrim值和trimmedString值粘贴到 regex101 测试窗口中,您将看到 Unicode 字符已从trimmedString值中删除。