How to remove backslash escaping from a javascript var?
You can use JSON.parse
to unescape slashes:
function unescapeSlashes(str) {
// add another escaped slash if the string ends with an odd
// number of escaped slashes which will crash JSON.parse
let parsedStr = str.replace(/(^|[^\\])(\\\\)*\\$/, "$&\\");
// escape unescaped double quotes to prevent error with
// added double quotes in json string
parsedStr = parsedStr.replace(/(^|[^\\])((\\\\)*")/g, "$1\\$2");
try {
parsedStr = JSON.parse(`"${parsedStr}"`);
} catch(e) {
return str;
}
return parsedStr ;
}
You can replace a backslash followed by a quote with just a quote via a regular expression and the String#replace
function:
var x = "<div class=\\\"abcdef\\\">";
x = x.replace(/\\"/g, '"');
document.body.appendChild(
document.createTextNode("After: " + x)
);
Note that the regex just looks for one backslash; there are two in the literal because you have to escape backslashes in regular expression literals with a backslash (just like in a string literal).
The g
at the end of the regex tells replace
to work throughout the string ("global"); otherwise, it would replace only the first match.
If you want to remove backslash escapes, but keep escaped backslashes, here's what you can do:
"a\\b\\\\c\\\\\\\\\\d".replace(/(?:\\(.))/g, '$1');
Results in:
ab\c\\d
.
Explanation of replace(/(?:\\(.))/g, '$1')
:
/(?:\\)
is a non-capturing group to capture the leading backslash
/(.)
is a capturing group to capture what's following the backslash
/g
global matching: Find all matches, not just the first.
$1
is referencing the content of the first capturing group (what's following the backslash).