使用 JavaScript RegExp() 過濾 HTML entity NBSP
總結
最近在實作「將字串中的空白移除」功能時,發現在執行完 str.replaceAll(/[\u0020\u3000]+/g, '')
後,資料中還是會有空白字元沒刪乾淨的問題。追查後發現是沒有過濾掉 HTML entity
的緣故。此篇文章將簡單筆記一下何謂
,並提供最後解決問題時使用的程式碼供參考。
筆記
關於 HTML entity
HTML entity 是一組文字,固定以 &
開頭、以 ;
結尾。通常用來表現保留字元(reserved character)或是不可視(invisible characters)字元。
MDN: An HTML entity is a piece of text (“string”) that begins with an ampersand (
&
) and ends with a semicolon (;
). Entities are frequently used to display reserved characters (which would otherwise be interpreted as HTML code), and invisible characters (like non-breaking spaces).
是一種不換行字元(non-breaking space),與透過空白鍵敲擊出來的空白不同,此字元會避免「換行」發生。
stackOverFlow: One is non-breaking space and the other is a regular space. A non-breaking space means that the line should not be wrapped at that point, just like it wouldn’t be wrapped in the middle of a word.
維基百科的說明如下:
Wikipedia: In word processing and digital typesetting, a non-breaking space — also called NBSP, required space, hard space, or fixed space (though it is not of fixed width) — is a space character that prevents an automatic line break at its position.
在程式碼上還有另一個差異,
的 character code 為 160
,而空白鍵產出的空白字元則是 32
(參考 ASCII table)。
過濾空白的程式碼
程式碼如下。使用 HTML_ENTITY_SPACE
的理由是為了給這個特殊字元一個有意義的名字,接著再透過 new RegExp()
來組合出「包含半形、全形與 NBSP」的過濾模式即可。
// 為 ` ` 建立有意義的變數名稱
const HTML_ENTITY_SPACE = String.fromCharCode(160);
// 透過 new RegExp() 來設定過濾半形、全形以及 HTML entity 空白的 regex 模式,符合此模式的內容將被取代掉
function removeFullAndHalfSpace(rawString: string): string {
const regexpSpace = new RegExp(`[\u0020\u3000${HTML_ENTITY_SPACE}]`, 'g');
return rawString.replaceAll(regexpSpace, '');
}