XMLのエスケープ
XML のテキスト部、属性値、CDATE部、の中では、適切にエスケープする必要がある。
テキスト部では、以下の文字が現れてはならない。
code:text_bad_chars.txt
& < >
属性値では、以下の文字が現れてはならない。
code:attribut_bad_chars.txt
& < >
' (ただし、シングルクォーテーションで括られていた場合)
" (ただし、ダブルクォーテーションで括られていた場合)
両方とも同じエスケープ方法が使われるため、テキスト部と属性値とを同じエスケープで済ませていることがほとんど。
エスケープ方法としては以下の2つがある。
数値文字参照 (numerical character references)
&(U+0026 AMPERSAND) の場合 & (16進)または & (10進)
16進に非対応な端末があるという説明がある。(本当?)
文字実体参照 (character entity references)
&(U+0026 AMPERSAND) の場合 &
読みやすさから、文字実体参照の方が一般的に使われる。
' は XML で定義されているが、HTML では定義されていない。
このため HTML では ' を使う。
わざわざほとんど同じエスケープ処理を作ることもないことから、' に変換するようにしてライブラリを共用していることがほとんど。
JavaScript
たぶん最適解
code:escapeXML.js
const ENTITY_MAP = {
"&": "&",
"<": "<",
">": ">",
"\"": """,
"'": "'"
};
export default function escapeXML(s) {
return s.replace(/&<>"'/g, (c) => { return ENTITY_MAPc; }); }
単純に文字列置換を連ねる方法(遅い)
code:replace_line.js
str.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
jQuery を使う方法(遅い)
code:jQuery_escapeHtml.js
$('<div/>').text('This is fun & stuff').html();
参考
C#
System.Security.SecurityElement.Escape
'に変換
System.Net.WebUtility.HtmlEncode
System.Web.HttpUtility.HtmlEncode
PHP
htmlspecialchars