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

IT技术 javascript unicode
2021-01-29 08:08:00

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

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

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

4个回答

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

var HTMLe=document.getElementsByTagName('html')[0]; HTMLe.outerHTML = HTMLe.outerHTML.replace(/[\u200B-\u200D\uFEFF\u200E\u200F]/g, ''); ... 这就是如何
2021-03-17 08:08:00
我们如何在 DOM 加载后检测这些值是否真的存在于页面上?谢谢!
2021-03-21 08:08:00
如果字符串是一串 unicode 字符,这将不起作用 - 仅使用它们创建一个 var 就会出错 var s = "\ud83d\ude0d\ud83d\ude0d\ud83d\ude0d\ud83d\ude0d\ud83d\ude0d‌​\ud83d\ude0d\ud83d\u‌​de0d\ud83d\ude0d\ud8‌​3d\ude0d\ud83d\ude18‌​\ud83d\ude18\ud83d\u‌​de18"<-- 包含实际的 \u200c 和 d
2021-03-21 08:08:00
@Iván Castellanos 提到了一些其他可以考虑的字符:U+200E LEFT-TO-RIGHT MARK 和 U+200F RIGHT-TO-LEFT MARK。正如我所说,可能还有其他符号本身并不严格可见。
2021-04-05 08:08:00

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

这是我使用 RegExp 变量的解决方案:

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

您可以在此处找到有关 Javascript 和零宽度空间的更多信息: Zero Width Spaces

or 符号可能会更慢(在 IE 中),因为它针对多字符匹配进行了优化。但是,谁知道呢,使用 google 的 V8,它的运行速度可能也一样快。
2021-03-23 08:08:00
这些不可见的零宽度 unicode 字符可用于隐藏元数据凭据,以便那些敢于通过浏览器复制和粘贴到另一个知道接收消息的编辑器并将零宽度元数据转换回没有字符的用户。所以会发生什么是你复制并粘贴“hi”这个词h,然后传输的是,然后是元数据凭据字符串,然后是i. 但来源和目的地只是显示这个词hi将这些零宽度的野蛮人和他们的波斯信使留在斯巴达护城河中将是一场斗争。伤心!
2021-03-26 08:08:00
[].filter.call( str, function( c ) {
    return c.charCodeAt( 0 ) !== 8203;
} );

过滤每个字符以去除 8203 字符代码(零宽度空间 unicode 数字)。

这是一个聪明的解决方案,使用现代 JavaScript 可以将其简化为以下单行: [].filter.call(strVal, c => c.charCodeAt() !== 8203).join('')
2021-04-06 08:08:00
str.replace(/\u200B/g,'');

200B 是零宽度空格 8203 的十六进制。用空字符串替换它以去除它