Javascriptで禁則処理をする(その2)

以前、作ったJavascriptでのコンバータ(禁則文字の置き換え目的)だが、あるアプリで使ったついで修正を加えた。

この間のプログラムの以下の問題点を改善した。
1.禁則文字が続いた場合、■1つに置換されてしまう。
2.■に置換するのは格好悪いので、化けそうも無い文字(列)に置換した方が使い勝手がいい。

ということで、以下の2点を改善してみた。

禁止する文字は以下のものとした。


これを置換する文字は、それぞれ、

1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20
1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,(株),(有),cm,kg,-

とした。

以下にスクリーンショットを示す。テキストエリアへの不正な入力(上段)を、2通りの変換で補正したものが下段。下段のテキストエリアでは、まず、禁止文字を■で置換し、その後、置換文字で置換してある。

以下に、コンバータ(Javascriptオブジェクト)のソースを示す。以下のソース中、illegalCharsReg、illegalCharsが文字化けしているが、この部分は上の禁止文字列である。
上の例では、入力値を、まずconvertIllegal()で変換し、その戻り値に、convertToRegalChar()の戻り値をappendしている。

/**
 * MyConverter.js
 * 
 * (C) 2009, tetsuya.odaka(EzoGP).
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
var MyConverter = function() {

	// 禁止文字のregex
	this.illegalCharsReg =/[����������������������������������〜]/g;
	// 禁止文字の羅列
	this.illegalChars ='����������������������������������〜';
	// 置換文字の配列
	this.legalChars = new Array(
		1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,
		1,2,3,4,5,6,7,8,9,10,
		1,2,3,4,5,6,7,8,9,10,
		'(株)','(有)','cm','kg','-'
	);
	
     /**
     * 禁則処理を行うメソッド
     *	禁止文字を■で置き換える。
     * 
     * @param
     *     		_str; 	置換対象の文字列
     * @return
     * 			置換後の文字列
     */

     this.convertIllegal = function(_str){
		// コンバート
		return _str.replace(this.illegalCharsReg,'■');
    };
    
     /**
     * 禁則処理を行うメソッド
     *	禁止文字を、適当な文字列で置き換える。
     * 
     * @param
     *     		_str; 	置換対象の文字列
     * @return
     * 			置換後の文字列
     */
    this.convertToRegalChar = function(_str){

	//文字列から置換する文字を取り出す
    	var _mArr = _str.match(this.illegalCharsReg);

		if(_mArr){
		    //置換する文字に対応する、legalなCharを配列に入れる。
    		    var _pArr = new Array();
    		    for(var i=0; i < _mArr.length; i++){
        		var _place = this.illegalChars.indexOf(_mArr[i],0);
	        	_pArr.push(this.legalChars[_place]);
    		    }

	    	    //順に置換していく
    		    for(var i=0; i < _mArr.length; i++){
		       // 動的にregexを作るには、RegExpを使った方が無難。
	    	       var _rStr = new RegExp(String(_mArr[i]),"g");
    	    	       _str = _str.replace(_rStr, _pArr[i]);
	    	    }
		}
    	return _str;
    };
    
    /* 自身の参照値を返却 */
    return this;
};


以下に、HTMLの全文を示す。このHTMLでは、TEXTAREAからフォーカスを外すと置換が起きるようにしている。

<HTML>
<HEAD>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<META http-equiv="Content-Style-Type" content="text/css">
<TITLE>MyConverter</TITLE>

<style type="text/css">
</style>
<!-- 読み込むjs --> 
<script type="text/javascript" src="../scripts/lib/yui/build/yahoo/yahoo-min.js">
</script>
<script type="text/javascript" src="../scripts/lib/yui/build/yahoo-dom-event/yahoo-dom-event.js">
</script>

<!-- MyConverter.jsの読み込み -->
<script type="text/javascript" src="MyConverter.js">
</script>

<script type="text/javascript">
/*
 * コンバート検証
 *  (モジュールパターンで実装)
 */
convert = function() {
	var cnvObj;
	var	Dom 	= YAHOO.util.Dom;	
	var	Event 	= YAHOO.util.Event;
		
	/**
	* Inputからフォーカスが外れたときのハンドラー
	*/
	var onBlurHdlr = function(_evt,_obj){
		
		_e = YAHOO.util.Event.getTarget(_evt)
		var _id = _e.id;
		var _resId = _id + '_res';
		
		// 検証対象を取得.
		var _str  = Dom.get(_id).value;
		
		var _ret = cnvObj.convertIllegal(_str);
		var _ret1 = cnvObj.convertToRegalChar(_str);

		Dom.get(_resId).innerHTML = _ret;
		Dom.get(_resId).innerHTML += '\n'+ _ret1;

	};
	
	return {
	    /**
  	    * 初期処理
 	    */
    	    init: function() {
    	
		cnvObj = new MyConverter();	

		var _inObj = document.getElementsByTagName('textarea');
		for(var i = 0; i < _inObj.length; i++){
			Event.addBlurListener(_inObj[i].id, onBlurHdlr, _inObj[i]);		    
		}
			
	    } // initの終わり
       };
}();

</script> 

</HEAD>
<BODY onload="convert.init()">
test_convert3.html
<h3>
クライアントサイドでのコンバート確認用
</h3>

<form method="post" action='#'>
<!--// 入力検証項目 -->

入力;<br>
<textarea id="area1" cols=50 rows=8></textarea><br>
<br>
出力;<br>
<textarea id="area1_res" cols=50 rows=10></textarea>


</form>

<br>
</body>
</HTML>