为了更好地演示和理解“字符串转义行为”,可以看下面的例子:
通过拆分字符串,您可以看到JS引擎解析后的内存中字符串的样子,从而提供解决此问题的潜在(丑陋)方案。
'file:///C:\funstuff\buildtools\viewer.html'.split('')
//>
["f", "i", "l", "e", ":", "/", "/", "/", "C", ":", "", "u", "n", "s", "t", "u",
"f", "f", "", "u", "i", "l", "d", "t", "o", "o", "l", "s", "", "i", "e", "w",
"e", "r", ".", "h", "t", "m", "l"]
'file:///C:\funstuff\buildtools\viewer.html'.split('').map( function(e){
return e.charCodeAt()
});
//>
[102, 105, 108, 101, 58, 47, 47, 47, 67, 58, 12, 117, 110, 115, 116, 117, 102,
102, 8, 117, 105, 108, 100, 116, 111, 111, 108, 115, 11, 105, 101, 119, 101,
114, 46, 104, 116, 109, 108]
//>in Hex values by applying .toString(16)
["66", "69", "6c", "65", "3a", "2f", "2f", "2f", "43", "3a", "c", "75", "6e",
"73", "74", "75", "66", "66", "8", "75", "69", "6c", "64", "74", "6f", "6f",
"6c", "73", "b", "69", "65", "77", "65", "72", "2e", "68", "74", "6d", "6c"]
基本上,单个反斜杠可以转义后面的字符,如果不注意转义上下文,则会导致意想不到的结果。
解决方案:
通过查找表,您可以恢复许多错误转义的字符,如果它们在可打印ASCII字符范围之外\x20-\x7F
。例如,对于上面的例子,12
或\x0c
[12..toString(16)
] 将变成 '\\'+'v'
,以此类推。
附:请注意发生了信息丢失,并且您正在尝试通过上下文或元信息来恢复信息,在这种情况下,字符串在可打印的ASCII范围内。
请与社区分享任何实现。谢谢!
.replace(/\\/g,"\\\\")
。例如,如果HTML文档中有反斜杠,则可以使用document.body.innerHTML.replace(/\\/g, "\\\\");
,它将用双反斜杠替换所有反斜杠。 - Viliami