Javascript中的非转义字符串

w8ntj3qf  于 2023-02-15  发布在  Java
关注(0)|答案(2)|浏览(187)

我需要在Javascript中对字符串进行反转义,但有时我的字符串已经反转义了,有时则没有:

// String 1
<?xml version="1.0" encoding="UTF-8" ?>

// String 2
<?xml version="1.0" encoding="UTF-8"?>

我使用以下方法:

function htmlDecode(input)
{
  var doc = new DOMParser().parseFromString(input, "text/html");
  return doc.documentElement.textContent;
}

但问题是,当我对字符串2进行"解码"时,得到的结果是?xml version="1.0" encoding="UTF-8"?
感谢您的帮助。

oprakyz7

oprakyz71#

你可以对字符串做一个正则表达式检查,看看是否存在字符的编码版本,如果存在,就进行解码,否则,就返回你交给函数的内容。

var string1 = '&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;';
var string2 = '<?xml version="1.0" encoding="UTF-8"?>';

function decode(input) {
  if (/&amp;|&quot;|&#39;|'&lt;|&gt;/.test(input)) {
    var doc = new DOMParser().parseFromString(input, "text/html");
    return doc.documentElement.textContent;
  }
  return input;
}

console.log(decode(string1));
console.log(decode(string2))

更简单(更好):

这个方法不需要正则表达式,并且总是返回未转义的字符串,而不会“过度取消转义”它们:

var string1 = '&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;';
var string2 = '<?xml version="1.0" encoding="UTF-8"?>';

function decode(input) {
  var txt = document.createElement("textarea");
  txt.innerHTML = input;
  return txt.value;
}

console.log(decode(string1));
console.log(decode(string2))
h43kikqp

h43kikqp2#

如果你的函数没有DOMParser函数的访问权限(例如在一个网络工作者中),你可以使用这个函数。这可能不适合长字符串,因为它每次都搜索整个字符串。
如果你在长字符串中使用这个函数,你可能需要使用indexOf的第二个参数来传递你想从其开始搜索字符串的索引,当然,这可能需要重写函数,而不是像这样做。

/** 
* Replace XML chars with HTML chars
**/
function unescapeXml( str ){
    [ "&lt;", "&gt;", "&amp;", "&quot;", "&apos;" ].forEach(function(x, i){
        if( str.indexOf(x) > -1  )
            str = str.replace(new RegExp(x, "gi"), [ '<', '>', '&', '"', '\'' ][i]);
    });
    return str;
}
var string1 = '&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;';
console.log(unescapeXml(string1));

相关问题