[英]Remove non-ascii character in string
var str="INFO] :谷���新道, ひば���ヶ丘2丁���, ひばりヶ���, 東久留米市 (Higashikurume)";
我需要從字符串中刪除所有非ascii字符,
意味着str只包含“INFO](Higashikurume)”;
ASCII的范圍是0到127,所以:
str.replace(/[^\x00-\x7F]/g, "");
它也可以通過正面的刪除聲明來完成,如下所示:
textContent = textContent.replace(/[\u{0080}-\u{FFFF}]/gu,"");
這使用unicode。 在Javascript中,當表達正則表達式的unicode時,字符用轉義序列\\u{xxxx}
指定,但標志'u'
必須存在; 注意正則表達式有標志'gu'
。
我稱這是一個“正面的刪除斷言”,意思是“正面”斷言表示要刪除哪些字符,而“否定”斷言則表示哪些字母不能刪除。 在許多情況下,如先前答案中所述,否定主張可能對讀者更具啟發性。 \\x00-\\x7F
“ ^
”表示“不”,范圍\\x00-\\x7F
表示“ascii”,因此兩者一起說“不是ascii”。
textContent = textContent.replace(/[^\x00-\x7F]/g,"");
對於只關心英語的英語使用者而言,這是一個很好的解決方案,對於原始問題也是一個很好的答案。 但在更一般的背景下,人們不能總是接受假設“所有非ascii都不好”的文化偏見。 對於使用非ascii但偶爾需要刪除的上下文,Unicode的正面斷言更適合。
字符串中嵌入零寬度非打印字符的一個很好的指示是當字符串的“長度”屬性為正(非零)時,但看起來像(即打印為)空字符串。 例如,我在Chrome調試器中顯示了一個名為“textContent”的變量:
> textContent
""
> textContent.length
7
這促使我想要查看該字符串中的內容。
> encodeURI(textContent)
"%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B%E2%80%8B"
這個字節序列似乎是一些Unicode字符的族,它們被字處理器插入到文檔中,然后進入數據字段。 最常見的是,這些符號出現在文檔的末尾。 CK-Editor(CKEditor)可以插入零寬度空間"%E2%80%8B"
。
encodeURI() UTF-8 Unicode html Meaning
----------- -------- ------- ------- -------------------
"%E2%80%8B" EC 80 8B U 200B ​ zero-width-space
"%E2%80%8E" EC 80 8E U 200E ‎ left-to-right-mark
"%E2%80%8F" EC 80 8F U 200F ‏ right-to-left-mark
一些參考文獻:
http://www.fileformat.info/info/unicode/char/200B/index.htm
https://en.wikipedia.org/wiki/Left-to-right_mark
請注意,雖然嵌入字符的編碼是UTF-8,但正則表達式中的編碼不是。 盡管字符在字符串中嵌入了UTF-8的三個字節(在我的例子中),但正則表達式中的指令必須使用雙字節Unicode。 實際上,UTF-8最長可達4個字節; 它不如Unicode那么緊湊,因為它使用高位(或位)來逃避標准的ascii編碼。 這在這里解釋:
您可以使用以下正則表達式替換非ASCII字符
str = str.replace(/[^A-Za-z 0-9 \.,\?""!@#\$%\^&\*\(\)-_=\+;:<>\/\\\|\}\{\[\]`~]*/g, '')
但請注意,空格,冒號和逗號都是有效的ASCII,因此結果將是
> str
"INFO] :, , , (Higashikurume)"
要使用帶重音的ASCII:
var str = str.replace(/[^\x00-\xFF]/g, "");
這些答案都沒有正確處理選項卡,換行符,回車符,有些不處理擴展的ASCII和unicode。 這將保留選項卡和換行符,但刪除控制字符和ASCII集之外的任何內容。 單擊“運行此代碼段”按鈕進行測試。 有一些新的javascript下來管道,所以在未來(2020+?)你可能不得不做\\u{FFFFF}
但還沒有
console.log("line 1\\nline2 \\n\\ttabbed\\nF̸̡̢͓̳̜̪̟̳̠̻̖͐̂̍̅̔̂͋͂͐l̸̢̹̣̤̙͚̱͓̖̹̻̣͇͗͂̃̈͝a̸̢̡̬͕͕̰̖͍̮̪̬̍̏̎̕͘ͅv̸̢̛̠̟̄̿i̵̮͌̑ǫ̶̖͓͎̝͈̰̹̫͚͓̠̜̓̈́̇̆̑͜ͅ".replace(/[\\x00-\\x08\\x0E-\\x1F\\x7F-\]/g, ''))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.