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


68

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

有时代码具有零宽度的空间,这真的很奇怪。我不知道用户是如何输入的。范例-“(​$".length === 3

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


您如何推断出一个零宽度字符?仅从长度上?非BMP字符的长度是2
的Jukka K. Korpela

当我转到字符串的末尾并按左箭头键时,在某一点上它不会向左移动,直到按了两次左箭头键。这就是我的推断。
user1437328'7

然后,您需要分析字符,例如写出数字代码。数据可能包含组合标记,以便在向左移动时将两个或更多字符视为一个单位。
Jukka K. Korpela

Answers:


117

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


4
@IvánCastellanos提到了一些其他可能需要考虑的字符:U + 200E左至右标记和U + 200F右至左标记。就像我说过的那样,可能还有其他一些符号本身并不严格可见。
Mathias Bynens 2013年

在DOM加载后,我们如何检测这些值是否真正存在于页面上?谢谢!
klewis 2014年

1
var HTMLe=document.getElementsByTagName('html')[0]; HTMLe.outerHTML = HTMLe.outerHTML.replace(/[\u200B-\u200D\uFEFF\u200E\u200F]/g, '');...就是这样

如果字符串是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
mplungjan

9

我有一个问题,一些不可见的字符损坏了我的JSON,并导致意外令牌ILLEGAL异常,这使我的网站崩溃了。

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

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

有关Javascript和零宽度空间的更多信息,请参见: 零宽度空间


或符号可能会变慢(在IE中),因为它已针对多字符匹配进行了优化。但是,使用Google的V8,谁知道呢,它可能运行得一样快。
杰克·吉芬

这些不可见的零宽度Unicode字符可用于为那些敢于通过浏览器复制和粘贴到知道会接收消息并将零宽度元数据转换回不存在字符的编辑器的用户隐藏元数据凭据。因此,发生的事情是您复制并粘贴单词“ hi” h,然后传输的是,然后是元数据凭据字符串,然后是i。但是来源和目的只是显示这个词hi。要将这些零宽度的野蛮人及其波斯信使挡在斯巴达护城河之外,将是一场艰苦的努力。伤心!
Eric Leschinski '18

3
[].filter.call( str, function( c ) {
    return c.charCodeAt( 0 ) !== 8203;
} );

过滤每个字符以删除8203字符代码(零宽度空格unicode号)。


这是一个聪明的解决方案,使用现代JavaScript可以简化为这种形式:[].filter.call(strVal, c => c.charCodeAt() !== 8203).join('')
Grant Humphries,

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.