1. ホーム
  2. javascript

[解決済み] javascriptでxmlエンティティをエスケープするには?

2023-05-24 08:11:46

質問

JavaScript(サーバーサイドのnodejs)で、出力としてxmlを生成するプログラムを書いています。

文字列を連結してxmlを構築しています。

str += '<' + key + '>';
str += value;
str += '</' + key + '>';

問題なのは もし value のような文字が含まれている場合 '&' , '>' または '<' ? これらの文字をエスケープする最善の方法は何ですか?

またはXMLエンティティをエスケープすることができるJavaScriptライブラリはありますか?

どのように解決するのですか?

HTMLエンコーディングは、単純に & , " , ' , <> の文字列を、同等のエンティティに置き換えます。順序が重要で、もしあなたが & を最初に置き換えないと、いくつかの実体を二重にエンコードしてしまいます。

if (!String.prototype.encodeHTML) {
  String.prototype.encodeHTML = function () {
    return this.replace(/&/g, '&amp;')
               .replace(/</g, '&lt;')
               .replace(/>/g, '&gt;')
               .replace(/"/g, '&quot;')
               .replace(/'/g, '&apos;');
  };
}

これでは @Johan B.W. de Vries さんが指摘されたように、タグ名の問題が発生するので、私が想定したのは value だけ

逆に、HTMLの実体をデコードしたい場合は 1 をデコードしていることを確認してください。 &amp;& に変更し、エンティティの二重デコードをしないようにします。

if (!String.prototype.decodeHTML) {
  String.prototype.decodeHTML = function () {
    return this.replace(/&apos;/g, "'")
               .replace(/&quot;/g, '"')
               .replace(/&gt;/g, '>')
               .replace(/&lt;/g, '<')
               .replace(/&amp;/g, '&');
  };
}

<サブ 1 は含まず、基本的なものだけです。 &copy; から © など


ライブラリに関しては アンダースコア.js (または Lodash を使用することもできます)は _.escape メソッドでこの機能を実行できます。