JavaScriptの正規化表現

JavaScriptの正規化の例で「HTMLの難読化」を作ります。

HTMLの難読化といっても、ここでは改行の削除とコメントの削除をするだけです。

 

但し、幾つかの記述パターンで適切な変換がなされない場合があります。

変換後は、動作テストをして正しく変換したか確認して下さい。

 

index.html

<!DOCTYPE html>

<html>

<head>

  <meta charset="UTF-8">

  <style> textarea { background-color: #f0ffff; } </style>

</head>

<body>

  <h1>HTMLの難読化 簡易版</h1>

 

  <textarea id="src" rows="10" cols="80"></textarea><br>

  <button onclick="encodeJS()">実行</button><br>

  <textarea id="des" rows="10" cols="80"></textarea><br>

<script>

function encodeJS() {

  $("des").value = convert($("src").value);

}

 

// 変換処理

function convert(src) {

  // Script

  pr = src.match(/\<pre\>[\s\S]*?\<\/pre\>/g);

  sty = src.match(/\<style\>[\s\S]*?\<\/style\>/g);

  scrip = src.match(/\<script\>[\s\S]*?\<\/script\>/g);

 

  // コメントを除去

  src = src.replace(/\<!--.*?--\>/gm, '');

  // 改行を除去

  src = src.replace(/(\r\n|\n|\r)/g, '');

  // Scriptを戻す

  if(pr !== null){

    for (let value of pr) { 

      src = src.replace(/\<pre\>.*?\<\/pre\>/, value);

    }

  }

  if(sty !== null){

    for (let value of sty) { 

      src = src.replace(/\<style\>.*?\<\/style\>/, value);

    }

  }

  if(scrip !== null){

    for (let value of scrip) { 

      value = scriptCnv(value);

      src = src.replace(/\<script\>.*?\<\/script\>/, value);

    }

  }

  return src;

}

function scriptCnv(scriptStr) {

  // コメントを除去

  scriptStr = scriptStr.replace(/\/\*[\s\S]*?\*\//gm, '');

  scriptStr = scriptStr.replace(/([\s]|{|}|\;)\/\/.*\n/g, '\n');

 

  // 改行を除去

  scriptStr = scriptStr.replace(/(\r\n|\n|\r)/g, ';');

  scriptStr = scriptStr.replace(/\;+/g, ';');

  scriptStr = scriptStr.replace(/\{\s*\;/g, '{');

  // 空白を削除

  scriptStr = scriptStr.replace(/\s*([\(\)\;\{\}\<\>\+\-\*\/\[\]\,])\s*/g, '$1');

  return scriptStr

}

function $(id) { return document.getElementById(id); }

</script>

</body>

</html> 

 

 pr = src.match(/\<pre\>[\s\S]*?\<\/pre\>/);

これで、preタグの内容を変数に保存しています。

  

src = src.replace(/\<pre\>.*?\<\/pre\>/, pr);

ここで、改行を削除したpreタグを変数の値に置き換えて元に戻しています。

正規化表現

scrip = src.match(/\<script\>[\s\S]*?\<\/script\>/g);

match ・・・マッチした文字列を変数に格納します。

\s ・・・空白文字(半角スペース、全角スペース、タブ、改行、改ページ)

\S ・・・空白文字以外の一文字

 

 

src = src.replace(/\<script\>.*?\<\/script\>/, value);

.(ピリオド) ・・・任意の1文字

*?(アスタリスク、クエスチョン) ・・・直前の文字が0文字以上続くもので、当てはまる中で最短のもの(最短一致)