JavaScript从字符串中删除ZERO WIDTH SPACE(unicode 8203)

时间:2014-06-13 12:22:36

标签: 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符号而不是字符本身来写这个?

[我对这个角色的谣言]

如果你没有遇到这个角色,(你可能没有,看到它肉眼看不见,除非它破坏你的代码并且你在试图找到它时发现了它)这是一个真实的 - 孔将导致某些类型的模式匹配故障。我把这只野兽关在笼子里了:

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

如果要查看它,请将这些括号复制到文本编辑器中,然后通过它们迭代光标。你会发现你需要三个步骤来传递看似2个字符的东西,你的光标会跳过中间的一个步骤。

2 个答案:

答案 0 :(得分:23)

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

答案 1 :(得分:3)

接受的答案对我的案子不起作用。

但是这个人做了:

def contato(request):
form = "Dummy String"
form_class = ContactForm
# if request is not post, initialize an empty form
#form = form_class(request.POST or None) # Maybe Not 
form = form_class(request.POST ) # Instead 
if request.method == 'POST':

    if form.is_valid():
        nome = request.POST.get('nome')
        email = request.POST.get('email')
        msg = request.POST.get('msg')

        send_mail('Subject here', msg, email, ['testmail@gmail.com'], fail_silently=False)
        return HttpResponseRedirect('blog/inicio')
return render(request, 'blog/inicio.html', {'form': form})