XMLのエスケープ
XML のテキスト部、属性値、CDATE部、の中では、適切にエスケープする必要がある。
テキスト部では、以下の文字が現れてはならない。
code:text_bad_chars.txt
& < >
属性値では、以下の文字が現れてはならない。
code:attribut_bad_chars.txt
& < >
' (ただし、シングルクォーテーションで括られていた場合)
" (ただし、ダブルクォーテーションで括られていた場合)
両方とも同じエスケープ方法が使われるため、テキスト部と属性値とを同じエスケープで済ませていることがほとんど。
エスケープ方法としては以下の2つがある。
数値文字参照 (numerical character references)
&(U+0026 AMPERSAND) の場合 &#x26; (16進)または &#38; (10進)
16進に非対応な端末があるという説明がある。(本当?)
文字実体参照 (character entity references)
&(U+0026 AMPERSAND) の場合 &amp;
読みやすさから、文字実体参照の方が一般的に使われる。
&apos; は XML で定義されているが、HTML では定義されていない。
このため HTML では &#39; を使う。
わざわざほとんど同じエスケープ処理を作ることもないことから、&#39; に変換するようにしてライブラリを共用していることがほとんど。
JavaScript
たぶん最適解
code:escapeXML.js
const ENTITY_MAP = {
"&": "&amp;",
"<": "&lt;",
">": "&gt;",
"\"": "&quot;",
"'": "&#39;"
};
export default function escapeXML(s) {
return s.replace(/&<>"'/g, (c) => { return ENTITY_MAPc; });
}
単純に文字列置換を連ねる方法(遅い)
code:replace_line.js
str.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
jQuery を使う方法(遅い)
code:jQuery_escapeHtml.js
$('<div/>').text('This is fun & stuff').html();
参考
http://debuggable.com/posts/encode-html-entities-with-jquery:480f4dd6-13cc-4ce9-8071-4710cbdd56cb
C#
System.Security.SecurityElement.Escape
https://docs.microsoft.com/ja-jp/dotnet/api/system.security.securityelement.escape?view=dotnet-plat-ext-3.1
&apos;に変換
System.Net.WebUtility.HtmlEncode
https://docs.microsoft.com/ja-jp/dotnet/api/system.net.webutility.htmlencode?view=netcore-3.1
System.Web.HttpUtility.HtmlEncode
https://docs.microsoft.com/ja-jp/dotnet/api/system.web.httputility.htmlencode?view=netcore-3.1
PHP
htmlspecialchars
https://www.php.net/manual/ja/function.htmlspecialchars.php
XML:CDATAのエスケープ
#XML #HTML #エスケープ