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

标签 javascript regex unicode

我正在编写一些处理网站内容的 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 表示法而不是字符本身来编写它?

[关于这个 Angular 色的漫谈]

如果你还没有遇到过这个 Angular 色,(你可能没有,因为它是肉眼看不见的,除非它破坏了你的代码并且你在试图定位错误时发现了它)它是一个真正的- 会导致某些类型的模式匹配出现故障的漏洞。我为你关上了野兽:

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

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

最佳答案

unicode 转义中的数字应该是十六进制,8203 的十六进制是 200B(这确实是一个 Unicode zero-width space ),所以:

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

Live Example :

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

关于JavaScript 从字符串中删除零宽度空格 (unicode 8203),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24205193/

相关文章:

javascript - jQuery 或 JavaScript 使 DIV 列在多个容器中具有相同的高度

用于搜索电子邮件中 ​​ "@"之前的字符的正则表达式模式

javascript - 尝试在 javascript 正则表达式中捕获组(来自 C# 的端口)

Python C-API : How to pass an UNICODE UTF-16 null terminated C string to my python app without converting to UTF-8?

javascript - 按内联 "style"属性对 Div 进行排序

javascript - 为什么要将对象中的所有值转换为 Javascript 中的字符串?

python-3.x - Pandas 通过正则表达式选择列,并通过 if、else 更改它们的值

c++ - 逐行读取 Unicode 文件 C++

Python 将 unicode 保存到 XML

javascript - 匹配字符但不匹配前面有