JavaScript 轉譯 XML 特殊符號
因為只有5個而已沒有線程的函式庫可以用,自己刻了一個又覺得直接替換好像有點太簡單,姑且看了一下怎麼用一張映射表來轉譯。
這個可以透過修改映射表任意變更對應的關係,相對來說應用在別的對方要修改可能會方便不少。
代碼
先上最簡單的直接替換掉
// 將實體字符轉換為特殊字符
const encodeXml = str => str.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, ''');
// 將特殊字符轉換為實體字符
const decodeXml = str => str.replace(/&/g, '&')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/"/g, '"')
.replace(/'/g, "'");
再來這個是統一拉到映射表理管理的做法
// 映射表
const entitiesMap = {
'&': '&',
'<': '<',
'>': '>',
'"': '"',
"'": ''',
}; const rvEntitiesMap = Object.fromEntries(Object.entries(entitiesMap).map(([k, v]) => [v, k]));
// 將實體字符轉換為特殊字符
const encodeXml = str => {
const regex = new RegExp(`[${Object.keys(entitiesMap).join('|')}]`, 'g');
return str.replace(regex, m => entitiesMap[m]);
};
// 將特殊字符轉換為實體字符
const decodeXml = str => {
const regex = new RegExp(`(${Object.keys(rvEntitiesMap).join('|')})`, 'g');
return str.replace(regex, m => rvEntitiesMap[m]);
};
// 測試
const text = '<root><node id="1">Hello & World</node></root>';
const encodedText = encodeXml(text);
const decodedText = decodeXml(encodedText);
console.log('原始文本:', text);
console.log('編碼後文本:', encodedText);
console.log('解碼後文本:', decodedText);
結果
原始文本: <root><node id="1">Hello & World</node></root>
編碼後文本: <root><node id="1">Hello & World</node></root>
解碼後文本: <root><node id="1">Hello & World</node></root>
版本問題
反轉哈希表的部分需要ES2019才能跑,不能跑可以替換成這個舊版的寫法
const rvEntitiesMap = Object.entries(entities).reduce((acc, [k, v]) => {
acc[v] = k;
return acc;
}, {});
-
沒有留言:
張貼留言