HTML ソースをページに表示させる際、そのままソースを記述してしまうと、HTML 要素として解釈されてしまうので、「< 」や「 >」 は変換(エスケープ)しておく必要があるが、いちいち変換するのは面倒なので一括して変換する方法のメモ。
目次
テキストエリアに入力した HTML ソースをボタンをクリックすると、エスケープ処理(変換)した文字列を表示するページを作成。
HTML の構造は以下の部分から成り、単純なもの。
<body> <div id="content"> <h1>変換(エスケープ)処理</h1> <p>HTML ソースを入力</p> <div> <textarea id="input" rows="10" cols="60"> </textarea> </div> <button id="convert">変換</button> <button id="clear">クリア</button> <div> <pre id="escapeHTML"></pre> </div> </div>
jQuery を使って処理を記述するので、body の閉じタグの直前等で jQuery を読み込む。
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
その後に以下の処理を記述。
<script> jQuery(function($){ $('#convert').click(function() { var converted = $('#input').val().replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/"/g, """).replace(/'/g, "'"); $('#escapeHTML').text(converted); }); $('#clear').click(function() { $('#input').val(''); $('#escapeHTML').text(''); }); }); </script> </body>
button 要素(id=”convert”)のクリックイベントで、変換した文字列を変数「converted」に格納して、それらを pre 要素(id=”escapeHTML”)のテキストとして表示。
また、button 要素(id=”clear”)のクリックイベントで、内容をクリア(空文字を代入)。
書式
replace(regexp, replacement)
jQuery の部分は、配列と for 文を使って以下のように記述ことも可能。
<script> jQuery(function($){ var targets = ["&", "<", ">" ,'"', "'"]; var escapes = ["&", "<", ">", """, "'"]; $('#convert').click(function() { var converted = $('#input').val(); for(var i=0; i<targets.length; i++){ converted = converted.replace(new RegExp(targets[i], 'g'), escapes[i]); } $('#escapeHTML').text(converted); }); $('#clear').click(function() { $('#input').val(''); $('#escapeHTML').text(''); }); }); </script>
for 文を使って順番に replace() メソッドを実行する際に、注意する点としては replace() メソッドの第一引数が「RegExp オブジェクト」であるということ。
以下のように記述すると、思い通りにならない。
for(var i=0; i<targets.length; i++){ converted = converted.replace(/targets[i]/, 'g'), escapes[i]); } または for(var i=0; i<targets.length; i++){ var target = '/' + targets[i] + '/'; converted = converted.replace(target, 'g'), escapes[i]); }
「/」と「/」で囲まれたパターン文字列の中に変数を使いたい場合は、new RegExp を使って正規表現オブジェクトを生成するようにする。
for(var i=0; i<targets.length; i++){ var target = new RegExp(targets[i], 'g'); converted = converted.replace(target, escapes[i]); }
正規表現(オブジェクト)は以下の 2 つの方法で作ることが可能。
参考:
「正規表現 – JavaScript | MDN」
「RegExp – JavaScript | MDN」
1.正規表現リテラルを使用する
var re = /abc/;
正規表現リテラルでは、スクリプトが評価されるときにその正規表現をコンパイルする。正規表現を定数として残しておくときは、この方法を使用するとよいパフォーマンスが得られる。
2.RegExp オブジェクトのコンストラクタ関数を呼び出す
var re = new RegExp("abc");
コンストラクタ関数を使用すると、実行時にその正規表現をコンパイルする。正規表現パターンが変わることがわかっている場合や、パターンがわからない場合、ユーザが入力するなど別のソースからパターンを取得する場合は、コンストラクタ関数を使用する。(変数を使用する場合)
以下は、ローカル環境で使用するのを前提としたサンプル。
<!doctype html> <html> <head> <meta charset="utf-8"> <title>変換(エスケープ)処理</title> <style> #content { margin: 20px auto; width: 100%; max-width: 900px; } h1 { font-size: 20px; } textarea { width: 95%; margin: 10px auto; } #escapeHTML { width: 95%; border: 1px solid #ccc; border-radius: 4px; padding: 10px; display: none; background-color: #efefef; font-family:"Lucida Console", Monaco, monospace; white-space: pre-wrap; overflow: auto; } #clear_all, #clear_escape { margin-right: 30px; } </style> </head> <body> <div id="content"> <h1>変換(エスケープ)処理</h1> <p>HTML ソースを入力</p> <div> <textarea id="input" rows="20" cols="60"> </textarea> </div> <button id="convert">変換</button> <button id="clear_all">全てクリア</button> <button id="clear_html">HTML をクリア</button> <button id="clear_escape">出力をクリア</button> <button id="restore">リストア</button> <div> <pre id="escapeHTML"></pre> </div> </div> <script src="http://code.jquery.com/jquery-1.10.1.min.js"></script> <script> jQuery(function($){ var targets = ["&", "<", ">" ,'"', "'"]; var escapes = ["&", "<", ">", """, "'"]; var restore_input = ''; var restore_escape = ''; $('#convert').click(function() { var converted = $('#input').val(); restore_input = converted; for(var i=0; i<targets.length; i++){ converted = converted.replace(new RegExp(targets[i], 'g'), escapes[i]); } restore_escape = converted; $('#escapeHTML').text(converted).css('display', 'block'); }); $('#clear_html').click(function() { $('#input').val(''); }); $('#clear_escape').click(function() { $('#escapeHTML').text('').css('display', 'none'); }); $('#clear_all').click(function() { $('#input').val(''); $('#escapeHTML').text('').css('display', 'none'); }); $('#restore').click(function() { $('#input').val(restore_input); $('#escapeHTML').text(restore_escape).css('display', 'block'); }); }); </script> </body> </html>