javascriptでPHPのhtmlspecialchars_decode をする
PR
ajax等で受け取ったjson等に含まれる値に htmlspecialchars_encode したものがある場合に、javascript側でdecodeして表示したい場合の方法。javascriptにはPHPのhtmlspecialchars_decodeにあたるものが無いようで、自分で文字を置き換えてやる必要があるみたいですが。その部分をやってくれる関数が公開されているのでそちらを使うと便利。
htmlspecialchars_decode 関数をjavascriptでも使う
php.js というPHPの関数をまとめたライブラリがあります。こちらのライブラリの中にhtmlspecialchars_decodeがありますので、こちらのコードを使うと簡単に利用出来る。
こちらのコードはMITライセンスになっているようです。
htmlspecialchars_decode:
https://github.com/kvz/phpjs/blob/master/functions/strings/htmlspecialchars_decode.js
#code
こちらのコードを読み込んでおきます、ファイルで読み込んでもいいしコードの隅に書いておいてもいい。
function htmlspecialchars_decode(string, quote_style) { // discuss at: http://phpjs.org/functions/htmlspecialchars_decode/ // original by: Mirek Slugen // improved by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // bugfixed by: Mateusz "loonquawl" Zalega // bugfixed by: Onno Marsman // bugfixed by: Brett Zamir (http://brett-zamir.me) // bugfixed by: Brett Zamir (http://brett-zamir.me) // input by: ReverseSyntax // input by: Slawomir Kaniecki // input by: Scott Cariss // input by: Francois // input by: Ratheous // input by: Mailfaker (http://www.weedem.fr/) // revised by: Kevin van Zonneveld (http://kevin.vanzonneveld.net) // reimplemented by: Brett Zamir (http://brett-zamir.me) // example 1: htmlspecialchars_decode("<p>this -> "</p>", 'ENT_NOQUOTES'); // returns 1: '<p>this -> "</p>' // example 2: htmlspecialchars_decode("&quot;"); // returns 2: '"' var optTemp = 0, i = 0, noquotes = false; if (typeof quote_style === 'undefined') { quote_style = 2; } string = string.toString() .replace(/</g, '<') .replace(/>/g, '>'); var OPTS = { 'ENT_NOQUOTES': 0, 'ENT_HTML_QUOTE_SINGLE': 1, 'ENT_HTML_QUOTE_DOUBLE': 2, 'ENT_COMPAT': 2, 'ENT_QUOTES': 3, 'ENT_IGNORE': 4 }; if (quote_style === 0) { noquotes = true; } if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags quote_style = [].concat(quote_style); for (i = 0; i < quote_style.length; i++) { // Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4 if (OPTS[quote_style[i]] === 0) { noquotes = true; } else if (OPTS[quote_style[i]]) { optTemp = optTemp | OPTS[quote_style[i]]; } } quote_style = optTemp; } if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) { string = string.replace(/�*39;/g, "'"); // PHP doesn't currently escape if more than one 0, but it should // string = string.replace(/'|�*27;/g, "'"); // This would also be useful here, but not a part of PHP } if (!noquotes) { string = string.replace(/"/g, '"'); } // Put this in last place to avoid escape being double-decoded string = string.replace(/&/g, '&'); return string; }
コードの実行はfunctionですので、2つの引数を渡して実行します
var html = "<p>this -> "</p>"; htmlspecialchars_decode( html , 'ENT_NOQUOTES' );
一つ目の引数には 変換する文字を入れます。2つ目の引数にはデコードのレベルを指定します 2つ目の引数はPHPでのhtmlspecialchars_encodeで指定したものを同じものを指定すると復元できます。2つ目の引数は省略かのうです。
2つ目の引数に入るものは以下になります
ENT_NOQUOTES ENT_HTML_QUOTE_SINGLE ENT_HTML_QUOTE_DOUBLE ENT_COMPAT ENT_QUOTES ENT_IGNORE
PR
COMMENT