この小さな関数は有効なHTMLを返すことができますか?
function HtmlSanitizer(text) {
return text.replace(/&(?!\s)|</g, function (s) { if(s == '&') return '&'; else return '<'});
}
編集:この関数の目的は、htmlインジェクションを回避することです。だから私は尋ねています。
この小さな関数は有効なHTMLを返すことができますか?
function HtmlSanitizer(text) {
return text.replace(/&(?!\s)|</g, function (s) { if(s == '&') return '&'; else return '<'});
}
編集:この関数の目的は、htmlインジェクションを回避することです。だから私は尋ねています。
この関数は、HTML エンティティにエンコードしたいもののごく一部のみを返します。したがって、あなたの質問に対する答えは「いいえ」です。
より完全なものを見つけるために、「javascript html entity encode」などを Google で検索することをお勧めします。
それは正規表現です:
/ /g
= グローバル置換、つまり、text
文字列内のすべてのオカレンスを置換&
= JS Regex の予約文字ではないため、テキスト内のアンパサンドに一致します。(?!)
?
= 「否定先読み」検索 (貪欲でない検索のための の独立した使用と混同しないでください。\s
= 任意の空白文字に一致|<
= アンパサンドと一致しなかった場合は、開始山括弧をキャッチしようとします次に、文字列をキャプチャしてコールバック関数に渡し、 を と&
に&
置き換え<
ます<
。これは、文字列を HTML エンコードする基本的な方法として機能しますが、私の意見では堅牢ではありません。
SGML (およびその派生物: HTML と XML) は、構文文字が完全にエンコードされることを好むため、アンパスタンド、開き括弧と閉じ括弧、および引用符のすべての出現をエンコードする必要がありますが、提供された関数はこれらのうちの 2 つしか行いません (当然、この2つが最も重要です)。
このエントリを読むことをお勧めします:入力フィールドから属性を読み取ったときに HTML エンコーディングが失われました