Javascript+PHP5で禁則処理をする
2009/5/27 ; 機能追加しました。(こちら)
===========================
クライアントサイド(=Javascriptのみ)での禁則処理を書いてみたので、同じ検証をAjax(XMLHttpRequest)を経由してサーバーサイドでの検証の書いてみた。
実際には、こっちを使うことになるだろうなー。
初期画面のスナップショットは以下。
仕様&動きはクライアントサイド(MyConverter.js)の場合と同じで、入力文字列内にある、以下の文字を「■」で置換する。
以下が、文字列を置換したときのスナップショット。入力フィールドに入力をして、フォーカスを外すと、AjaxでPHPプラグラムを呼び出して禁則文字を置換する。
置換を行うPHPプログラムは、クラス(MyConverter.class.php)とした。
<?php /** * MyConverter.class.php * * (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. */ /* * データコンバート用Class * * author; t.odaka * date; 2009/4/23 * */ class MyConverter { /* * プロパティー * 適当に書き換えてください。 */ var $_illegalChars = '/[����������〜]+/u'; var $_replaceChars = '■'; /* * デフォルトのコンストラクタ */ function __construct() { } /* * 禁則文字の置換メソッド(UTF-8のみ) * パラメータ * $_str : 禁則文字があるかもしれない文字列 * 戻り値 : 置換後の文字列 */ function convertIllegal($_str){ // 置換 mb_regex_encoding('UTF-8'); $_ret = preg_replace($this->_illegalChars, $this->_replaceChars, $_str); return $_ret; } /* * サニタイズ * 入力値のサニタイズを行う * パラメータ * $_str : 検証する文字列 * $_encode : エンコーディング * */ function sanitize($_str, $_encode){ $_ret = htmlentities($_str,ENT_QUOTES,$_encode); return $_ret; } } ?>
Ajaxのリクエストは、一旦、以下のPHPプログラムで受け取られて、MyCoverter.class.phpに渡される。
<?php /* MyConverter.class.phpを使ったサンプル author ; t.odaka date ; 2009/4/23 */ include("../Myznala/MyConverter.class.php"); require("../Myznala/debugLog.php"); switch($_SERVER['REQUEST_METHOD']) { case 'GET' : $rMethod = &$_GET; break; case 'POST' : $rMethod = &$_POST; break; default: } // MyConverterをインスタンス化する。 $cnvObj = new MyConverter(); $val = $rMethod['val']; $val = mb_convert_encoding($val, "UTF-8", "auto"); // サニタイズ $val = $cnvObj->sanitize($val,"UTF-8"); // 禁則文字の処理 $ret = $cnvObj->convertIllegal($val); // 結果の返却 header("Content-Type:text/html"); echo $ret; ?>
スナップショットのHTML(+Javascript)は以下の通り。
<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"> input.ez_initguide { /* grey */ color:#808080; } </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> <script type="text/javascript" src="../scripts/lib/yui/build/connection/connection-min.js" > </script> <script type="text/javascript" src="../scripts/myznala.js"> </script> <script type="text/javascript"> /* * コンバート検証 * (モジュールパターンで実装) */ validate = function() { var Dom = YAHOO.util.Dom; var Event = YAHOO.util.Event; /** * Inputにフォーカスが当たったときのハンドラー */ var onFocusHdlr = function(_evt,_obj) { // 初期値(入力ガイド)の場合だけ、入力値を消す。 // Dom.getStyleColor()は // rgb(128,128,128); mozilla, chrome, // #808080; IE7 // と異なった戻り値となる。 // _objは,HTMLInputElement; _e = YAHOO.util.Event.getTarget(_evt) var _id = _e.id; var _resId = _id + '_res'; var _fColor=Dom.getStyle(_id, 'color'); if( _fColor == 'rgb(128, 128, 128)' || _fColor == '#808080'){ // for IE Dom.get(_id).value=""; } // 入力フィールドの色を白にする。 Dom.setStyle(_id, 'background-color', 'white'); // 入力フィールドの文字の色をグレーから黒に変える Dom.setStyle(_id, 'color', 'black'); // メッセージフィールドを消す Dom.get(_resId).innerHTML=""; }; /** * 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 _url = "test_convert.php" // MyConverter.class.phpの仕様にしたがって、パラメータを設定する。 var _parm = 'val='+_str; var _arg ={ 'id': _id, 'resId': _resId }; // 戻ってきたときのために、エレメントのidをセットする。 ajaxCallback.argument = _arg; // ajaxでコンバート YAHOO.util.Connect.asyncRequest('POST',_url, ajaxCallback, _parm); }; /* * Ajaxハンドラー * */ var ajaxHandlers = { // 受信成功時の処理 responseSuccess: function(_oj){ var _id = _oj.argument.id; var _resId = _oj.argument.resId; // データの取得 var _ret = _oj.responseText; if(_ret.length>0){ // エラーが複数のときは複数行にして表示する。 if(Dom.get(_resId).innerHTML.length>0){ Dom.get(_resId).innerHTML += '   ' +_ret; }else{ Dom.get(_resId).innerHTML = _ret; } } }, // 受信失敗時の処理 responseFailure: function(_oj){ var _id = _oj.argument.id; var _resId = _oj.argument.resId; var _ret = 'ステータス: ' + _oj.status + 'ステータステキスト: ' + _oj.statusText + '読み込みに失敗しました。'; // エラーのハンドル(皆さん適当に) // 入力フィールドの色をピンクにする。 Dom.setStyle(_id, 'background-color', 'pink'); Dom.get(_resId).innerHTML = _ret; } }; /* * コールバック成功/失敗時の振り分け * */ var ajaxCallback = { success: ajaxHandlers.responseSuccess, failure: ajaxHandlers.responseFailure, cache: false, scope: ajaxHandlers, argument: null }; return { /** * 初期処理 */ init: function() { // HTMLInputElementの配列を取得する。 var _inObj = document.getElementsByTagName('input'); for(var i = 0; i < _inObj.length; i++){ // type=textに、focusとblurにイベントを仕込む if(_inObj[i].getAttribute('type') == 'text'){ Event.addFocusListener(_inObj[i].id, onFocusHdlr, _inObj[i]); Event.addBlurListener(_inObj[i].id, onBlurHdlr, _inObj[i]); } } } // initの終わり }; }(); </script> </HEAD> <BODY onload="validate.init()"> <h3> サーバーサイドでのコンバート確認用 </h3> <form method="post" action='#'> <!--// 入力検証項目 --> 入力; <input id="text1" class="ez_initguide" type="text" size=50 value="入力してください." /> <div id="text1_res"></div> </form> <br> </body> </HTML>