preタグ内の 「<」 と 「>」 を < と > に置換(および 元に戻す)
Category - Javascript のメモ - [3]
preタグ内にHTMLタグや比較演算子などを記述する場合は、「<」 や 「>」 を実体参照(< や >)に置換して記述しなければならない。。。
これかなり面倒です。
なので Javascriptで、textareaに入力された内容にpreタグがあった場合に、preタグ内の 「<」 と 「>」 を < と > に置換(および 元に戻す)する関数を作りました。
私の都合でtextareaの文字を置換するようにしましたが、なんであれ同じようなものです。
★Javascript
// preタグ内の 「<」 と 「>」 を < と > に置換 および 元に戻す(逆に置換する) // そのままではpre内のタグはhtmlタグとして認識されるので、実体参照 < > に置き換える必要がある。 function escapeTag(textAreaId){ var ta = document.getElementById(textAreaId); var s = ta.value; var strA = ""; var strB = ""; var strPre; var n = 0; var i = 0; var nType = 0; // 0:実体参照に変換 1:実体参照から元に戻す // 第二引数があれば nType を引数から取得 // 第二引数を1にして呼び出せば「元に戻す」ことに if (arguments.length > 1) nType = arguments[1]; while(true){ n = s.indexOf("<pre>", n); if (n != -1) { i = s.indexOf("</pre>", n + 5); // 5 ... <pre> の文字数 if (i != -1) { strA = s.substring(0, n + 5); // 5 ... <pre> の文字数 strPre = s.substring(n + 5, i); // 5 ... <pre> の文字数 strB = s.substring(i); if (nType == 0) strPre = exchgLtGt(strPre); // 置換 else strPre = rvsLtGt(strPre); // 置換(逆) s = strA + strPre + strB; n = (strA + strPre).length + 6; // 6 ... </pre> の文字数 continue; } } break; } ta.value = s; }; function exchgLtGt(s){ s = s.replace(/</igm,"<"); // 正規表現で < を置換 s = s.replace(/>/igm,">"); // 正規表現で > を置換 return s; }; function rvsLtGt(s){ s = s.replace(/\</igm,"<"); // 正規表現で < を置換 s = s.replace(/\>/igm,">"); // 正規表現で > を置換 return s; };
HTML側はこんな感じにします。
★HTML
<form> <textarea rows="25" cols="50" id="ta"></textarea> </form> <input type="button" onclick="escapeTag('ta')" value="実体参照に置換" /> <input type="button" onclick="escapeTag('ta',1)" value="もとに戻す" />
動作確認はこちらにて。