JavaScriptで正規表現（エスケープ編）

正規表現で文字列の置き換えを纏めてみました。

あまり自身ないんで、「おかしいよ」「こうした方がいいんじゃない」っていうのがあったらコメント下さい :smile: 

> なお、簡単なテストは通していますがすべてを網羅しているわけではありませんので、ご使用になる際にはご自身で十分検証の上ご利用下さい :bangbang:  

* [JavaScriptで正規表現（文字列制限編）](http://qiita.com/hrdaya/items/2cd5cc19cae35061225c)
* [JavaScriptで正規表現（文字列置換え編）](http://qiita.com/hrdaya/items/291276a5a20971592216)
* [JavaScriptで正規表現（数字操作編）](http://qiita.com/hrdaya/items/9afafc571827358de3cd)
* [JavaScriptで正規表現（エスケープ編）](http://qiita.com/hrdaya/items/4beebbdb57009b405d2d):point_left: この投稿 

参考サイト

* [6. TERASOLUNA Server Framework for Java (5.x)によるセキュリティ対策](http://terasolunaorg.github.io/guideline/5.0.0.RELEASE/ja/Security/XSS.html)
* [Closure Templatesのオートエスケープが最強すぎる件](http://teppeis.hatenablog.com/entry/20120318/1332092081)
* [XSS対策:JavaScriptのエスケープ(その2)](http://d.hatena.ne.jp/ockeghem/20070514/1179159654)

```js
/**
 * HTMLエスケープ
 * 
 * @param {String} str 変換したい文字列
 */
var escapeHTML = function (str) {
    return str
            .replace(/&/g, '&amp;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(/"/g, '&quot;')
            .replace(/'/g, '&#39;');
};
```

```js
/**
 * HTMLアンエスケープ
 * 
 * @param {String} str 変換したい文字列
 */
var unEscapeHTML = function (str) {
    return str
            .replace(/(&lt;)/g, '<')
            .replace(/(&gt;)/g, '>')
            .replace(/(&quot;)/g, '"')
            .replace(/(&#39;)/g, "'")
            .replace(/(&amp;)/g, '&');
};
```

```js
/**
 * JavaScriptエスケープ
 * 
 * @param {String} str 変換したい文字列
 */
var escapeJs = function (str) {
    return str
            .replace(/\\/g, '\\\\')
            .replace(/'/g, "\\'")
            .replace(/"/g, '\\"')
            .replace(/\//g, '\\/')
            .replace(/</g, '\\x3c')
            .replace(/>/g, '\\x3e')
            .replace(/(0x0D)/g, '\r')
            .replace(/(0x0A)/g, '\n');
};
```

```js
/**
 * JavaScriptアンエスケープ
 * 
 * @param {String} str 変換したい文字列
 */
var unEscapeJs = function (str) {
    return str
            .replace(/\\'/g, "'")
            .replace(/\\"/g, '"')
            .replace(/\\\//g, '/')
            .replace(/\\x3c/g, '<')
            .replace(/\\x3e/g, '>')
            .replace(/\\\\/g, '\\');
};
```

```js
/**
 * JavaScriptとHTMLのエスケープ
 * 
 * @param {String} str 変換したい文字列
 */
var escapeJsHTML = function (str) {
    return str
            .replace(/\\/g, '\\\\')
            .replace(/'/g, "\\'")
            .replace(/"/g, '\\"')
            .replace(/\//g, '\\/')
            .replace(/</g, '\\x3c')
            .replace(/>/g, '\\x3e')
            .replace(/(0x0D)/g, '\r')
            .replace(/(0x0A)/g, '\n')
            .replace(/&/g, '&amp;');
};
```

```js
/**
 * 外部リンク不可、括弧類のエスケープ
 * 
 * @param {String} str 変換したい文字列
 */
var noScript = function (str) {
    return str
            .replace(/(\/\/)/g, '／／')
            .replace(/\(/g, '（')
            .replace(/\)/g, '）')
            .replace(/\[/g, '［')
            .replace(/\]/g, '］')
            .replace(/\{/g, '｛')
            .replace(/\}/g, '｝');
};
```

番外編

```js
/**
 * 文字列strをUTF-8ベースでエンコード
 * 
 * 特別な意味を持つ予約文字「/」「:」「&」「+」「=」はエンコードしない
 * 
 * @param {String} str 変換したい文字列
 */
encodeURI(str);
```

```js
/**
 * encodeURI、もしくはそれに類似したルーチンによって作成された
 * URIの要素をデコード
 * 
 * @param {String} str 変換したい文字列
 */
decodeURI(str);
```

```js
/**
 * 文字列strをURIを構成する部分文字列としてエンコード
 * 
 * URIで使用する記号をすべてエンコードするため、完全なエンコードになります。
 * 特別な意味を持つ予約文字「/」「:」「&」「+」「=」などもエンコードする為
 * URI全体に適用するとそれ自体はURIとして機能しなくなる。
 * 
 * @param {String} str 変換したい文字列
 */
encodeURIComponent(str);
```

```js
/**
 * encodeURIComponent、もしくはそれに類似したルーチンによって作成された
 * URIの要素をデコード
 * 
 * @param {String} str 変換したい文字列
 */
decodeURIComponent(str);
```