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

问题描述 投票:0回答:3

我正在编写一些处理网站内容的 JavaScript。当用户按退格键时,SharePoint 文本编辑器倾向于在文本中放置“零宽度空格”字符,这阻碍了我的努力。 该字符的 unicode 值为 8203,即十六进制的 B200。我尝试使用默认的“替换”功能来摆脱它。我尝试了很多变体,但没有一个起作用:

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 表示法而不是字符本身来编写此代码?

[我对这个角色的漫谈]

如果你还没有见过这个角色(你可能还没有见过,因为它是肉眼看不见的,除非它破坏了你的代码并且你在尝试定位错误时发现了它)它是一个真正的混蛋这将导致某些类型的模式匹配出现故障。我已经为你把野兽关在笼子里了:

[] <- careful, don't let it escape.

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

javascript regex unicode
3个回答
41
投票

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

7
投票

接受的答案不适用于我的案例。

但是这个做到了:

text.replace(/(^[\s\u200b]*|[\s\u200b]*$)/g, '')

0
投票

有关更多详细信息,请参阅此答案,但您可以匹配整个“类别”(包括零宽度空间、零宽度连接符、零宽度非连接符和其他一堆 - 请参阅标题为“相关Unicode”的表格具有 White_Space=no 属性的字符在这篇维基百科文章中)如下所示:

let a = "o​m"; // the invisible character is between o and m
console.log(a.length) // 3
console.log(a.replace(/\p{Cf}/gu, '').length) // 2

“Cf”表示“类别:格式

© www.soinside.com 2019 - 2024. All rights reserved.