JavaScript从字符串中删除零宽空格(Unicode 8203)

29

我正在编写一些处理网站内容的 JavaScript。然而,SharePoint 文本编辑器的倾向性阻碍了我的努力,因为当用户按下退格键时,文本编辑器会在文本中插入“零宽度空格”字符。

该字符的 Unicode 值为 8203 或十六进制值 B200。我尝试使用默认的“replace”函数将其删除,但是无论尝试多少个变体,都没有奏效。

var a = "o​m"; //the invisible character is between o and m

var b = a.replace(/\u8203/g,'');
= a.replace(/\uB200/g,'');
= a.replace("\\uB200",'');

等等,诸如此类的东西。我尝试了许多与这个主题相关的表达方式。这些表达方式都不起作用(在Chrome和Firefox中测试)。唯一起作用的是在表达式中键入实际字符:

var b = a.replace("​",''); //it's there, believe me

这可能会带来问题。由于该字符是不可见的,所以那一行本身并没有意义。我可以通过注释来解决这个问题。但如果代码被重用,并且文件使用非Unicode编码保存(或者当它部署到SharePoint时,无法保证它不会弄乱编码),它将停止工作。有没有办法使用unicode符号代替字符本身来编写这个字符?

[我对这个字符的胡言乱语]

如果你还没有遇到过这个字符(你很可能没有遇到过,因为它对肉眼是不可见的,除非它破坏了你的代码并在尝试查找错误时发现了它),它是一个真正的混蛋,会导致某些类型的模式匹配失效。我已经为你关起了这只野兽:

[​] <- 小心,不要让它逃脱。

如果您想看到它,请将这些括号复制到文本编辑器中,然后迭代光标穿过它们。您会注意到,您需要三个步骤才能通过看起来像2个字符的内容,而且在中间,光标会跳过一步。

2个回答

39

在unicode转义中,数字应该使用十六进制表示,8203对应的十六进制为200B(确实是一个Unicode零宽空格),因此:

var b = a.replace(/\u200B/g,'');

在线实例

var a = "o​m"; //the invisible character is between o and m
var b = a.replace(/\u200B/g,'');
console.log("a.length = " + a.length);      // 3
console.log("a === 'om'? " + (a === 'om')); // false
console.log("b.length = " + b.length);      // 2
console.log("b === 'om'? " + (b === 'om')); // true

谢谢,你是救命恩人! - jaggedsoft

7
接受的回答对我的情况没有用。 但这一个有用:
text.replace(/(^[\s\u200b]*|[\s\u200b]*$)/g, '')

一样!有任何想法为什么吗?我试了很多正则表达式的解决方案都没用,而你的却可以 :) - Stan Smulders

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接