經過正則爲XML過濾非法字符

最近項目中遇到一個跟xml非法字符有關的bug,因而瞭解了一下相關內容,在前端對xml非法字符進行過濾,以便前端能作更多的事情。先了解一下幾個概念。javascript

什麼是XML

xml(eXtensible Markup Language)是被設計出來傳輸和存儲數據的語言,它的結構和html很像,而html的用途是顯示數據。咱們能夠在一些ajax請求的form data中看到相似的內容:php

<!--demo來着菜鳥教程-->
<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
    <book category="CHILDREN">
        <title>Harry Potter</title>
        <author>J K. Rowling</author>
        <year>2005</year>
        <price>29.99</price>
    </book>
    <book category="WEB">
        <title>Learning XML</title>
        <author>Erik T. Ray</author>
        <year>2003</year>
        <price>39.95</price>
    </book>
</bookstore>
複製代碼

這個就是xml,他就是以這種方式來傳遞數據。第一行爲聲明,代表xml版本和編碼。xml可使用任何名詞做爲它的元素名,可是越簡潔越好,避免在名稱中使用「-」,「.」,「:」。能夠經過元素內容或屬性來攜帶信息。html

ASCII碼

定義了英語字符和二進制之間的關係,用一個字節(8位)表示一個字符。一共表示128個字符,其中還包括32個不能打印的控制符號。而且只佔用一個字節的後面7位,第一位爲0。ASCII表對應維基百科ASCII table前端

unicode碼

ASCII表只能表示有限的字符,而unicode則是一個更廣的字符集,碼點範圍從U+0000一直到U+10FFFF。幾乎包括了全部的字符。而後關於unicode碼的存儲方式有多種,好比utf-8,utf-16,utf-32等編碼方式,他們規定了怎麼存儲和解析unicode符號。java

JavaScript對unicode的表示

在javascript中可使用unicode表示字符。在es6以前,可使用\uxxxx的方式來表示\u0000~uffff之間的符號。超過這個範圍的就要使用兩個雙字節來表示。而es6以後,能夠經過一個大括號來表示任何的unicode符號。好比 \u{23333}es6

console.log('\u0061')
// a
console.log('\u{61}')
// a
複製代碼

而且es6還實現了正則表達式對u修飾符的支持,含義爲Unicode模式,能夠直接匹配大於\ufff的字符。ajax

sWords = sWords.replace(/\u{23333}/u,"")
複製代碼

解決問題

瞭解了這些東西以後就能夠對咱們的xml進行非法字符的過濾了。首先咱們查看一下xml1.0版本(目前針對1.0)的字符範圍正則表達式

#x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
複製代碼

那麼不在這個範圍裏面的屬於xml非法字符了,並且這麼巧,大於uffff的符號都支持,而後不支持的符號咱們能夠經過正則去把他們過濾掉:ui

sXml = sXml.replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\ud800-\udfff\ufffe\uffff]/g, "")
複製代碼

這樣咱們就把xml1.0不支持的符號過濾掉了。其餘版本同理。編碼

參考文章: 字符編碼筆記:ASCII,Unicode 和 UTF-8

es6正則的擴展 阮一峯

相關文章
相關標籤/搜索