2012-07-03 157 views
39

我接受用戶輸入(JS代碼)並實時執行(處理)它們以顯示某些輸出。從JavaScript字符串中刪除零寬度空格字符

有時代碼有那些零寬度的空間,這真的很奇怪。我不知道用戶是如何輸入的。示例 - 「(​$".length === 3

我需要能夠從我的代碼在JS中刪除該字符我該怎麼做呢?或者theres一些其他方式來執行該JS代碼,以便瀏覽器不佔用零?寬度空格字符考慮

+0

你是如何推斷有一個零寬度的字符?從單獨的長度?非BMP字符的長度爲2. –

+0

當我走到字符串的末尾時,點擊左箭頭,在一點上,它不會向左移動,直到按左箭頭鍵兩次。這就是我的感受。 – user1437328

+0

然後您需要分析字符,例如通過寫出數字代碼。數據可能包含組合標記,以便在向左移動時將兩個或更多個字符視爲一個單位。 –

回答

58

Unicode有以下零寬度字:

  • U + 200B零寬度空間
  • U + 200C零寬度非木匠Unicode代碼點
  • U + 200D零寬度木匠Unicode代碼點
  • U + FEFF零寬度無間斷間隔統一代碼點

要在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’s control characters

+3

[@IvánCastellanos提到](https://twitter.com/ivanca/status/354252316435689472)可能考慮的其他字符:U + 200E左對右標記和U + 200F右對齊標記。正如我所說,可能有其他符號本身並不嚴格可見。 –

+0

我們如何檢測這些值是否在DOM加載後實際存在於頁面上?謝謝! – blackhawk

+0

'var HTMLe = document.getElementsByTagName('html')[0]; HTMLe.outerHTML = HTMLe.outerHTML.replace(/ [\ u200B- \ u200D \ uFEFF \ u200E \ u200F]/g,'');'...這就是如何 – 2017-05-16 16:20:22

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

過濾器的每個字符以除去焦炭8203碼(零寬度空間的unicode數)

5

我有一個問題,一些看不見的字符正在破壞我的JSON,導致意外的標記非法異常,這是我的網站崩潰。

下面是使用正則表達式可變我的解決方案:

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

更多關於JavaScript和零米寬度的空間,你可以在這裏找到: Zero Width Spaces

+0

或符號可能會更慢(在IE中),因爲它針對多字符匹配進行了優化。但是,有了谷歌的V8,誰知道,它的運行速度可能一樣快。 –

2
str.replace(/\u200B/g,''); 

200B是零寬度空間8203的十六進制。用空字符串替換此刪除此