> NoControl >> Enc >> Max >> Min >> CutByte >> CutLength >> Entity >> Between >> MaxByte >> MinByte >> MaxLength >> MinLength >> Is >> Or >> Format 「※」この印のオプションは条件により「false」を返す場合があります。 Raw 【 only string 】 value = true || false @true クォートされていない文字列を返す @false クォートされた文字列を返す exp) "Raw:true" NoControl 【 only string 】 value = (no value) 改行、タブ以外のコントロールコードを削除する exp) "NoControl" Enc 【 only string 】 value = (toEncoding) || (fromEncoding)->(toEncoding) 文字列をtoEncodingのエンコードする。変換前のfromEncodingも指定できる exp) "Enc:SJIS->UTF-8" Format value = (format) sprintfでフォーマットした文字列を返す。 注意:このオプション以前でdataがfalseとなった場合は実行されません。 Max 【 only numeric 】 value = (number) @number 数値 最大値を設定する。データが最大値より大きい場合は、最大値を返す exp) "Max:1024" Min 【 only numeric 】 value = (number) @number 数値 最小値を設定する。データが最小値より小さい場合は、最小値を返す exp) "Max:8" CutByte 【 only string 】 value = (number) @number バイト数 文字列を指定バイトで切る exp) "CutByte:8" CutLength 【 only string 】 value = (number) @number 長さ 文字列を指定した長さ(半角文字を1,全角文字を2)で切る exp) "CutLength:64" Entity 【 only string 】 value = true@(encoding) || false @true データの特殊文字を HTML エンティティに変換する @encoding 変換するデータのエンコーディング @fale データの特殊な HTML エンティティを文字に戻す exp) "Entity:true" Between ※ 【 only numeric 】 value = (number)->(number) @number 数値 最小値と最大値を設定する。範囲外の場合、データはfalseを返す exp) "Between:8.6->1024" MaxByte ※ 【 only string 】 value = (number) @number バイト数 文字列が指定バイトより大きい場合、falseを返す exp) "MaxByte:255" MinByte ※ 【 only string 】 value = (number) @number バイト数 文字列が指定バイトより小さい場合、falseを返す exp) "MinByte:1" MaxLength ※ 【 only string 】 value = (number) @number 長さ 文字列が指定した長さ(半角文字を1,全角文字を2)より大きい場合、falseを返す exp) "MaxLength:100" MinLength ※ 【 only string 】 value = (number) @number 長さ 文字列が指定した長さ(半角文字を1,全角文字を2)より小さい場合、falseを返す exp) "MinLength:4" Is ※ value = (type)@(mixed) @type mixedの型 "integer", "int", "float", "double", "string" @mixed 値 データが指定した値であればtrue、そうでなければfalseを返す exp) "Is:int@256" "Is:string@Success" このオプション以前にエンコード処理等を行えば、マルチバイトでも評価できると思います Or ※ value = (type)@(mixed | mixed | ....) @type mixedの型 "integer", "int", "float", "double", "string" @mixed 値 データが指定した値の中にあればmixedを返す、なければfalseを返す exp) "Or:int@256|1024|2048" "Or:string@Man|Woman" このオプション以前にエンコード処理等を行えば、マルチバイトでも評価できると思います */ class method extends str{ //process sequence private static $optionOrder = Array("Raw", "NoControl", "Enc", "Max", "Min", "CutByte", "CutLength", "Entity", "Between", "MaxByte", "MinByte", "MaxLength", "MinLength", "Is", "Or", "Format"); //Boolean especial string of false private static $booleanFalseString = Array("false", "null", "no", "off", "0", "ng", "disable", "hidden", ""); //GET public static function GET($name, $type, $default, $options = ""){ if(isset($_GET[$name])){ return self::methodHandler($_GET[$name], $type, $options); }else{ return $default; } } //POST public static function POST($name, $type, $default, $options = ""){ if(isset($_POST[$name])){ return self::methodHandler($_POST[$name], $type, $options); }else{ return $default; } } //COOKIE public static function COOKIE($name, $type, $default, $option = ""){ if(isset($_COOKIE[$name])){ return self::methodHandler($_COOKIE[$name], $type, $options); }else{ return $default; } } /******************************************************************* mixed function FILES ( string $name, string $encoding) $name [string] key name $encoding [string] encoding *******************************************************************/ public static function FILES($name, $encoding){ if(isset($_FILES[$name])){ $FILES = $_FILES[$name]; if(is_array($FILES["size"])){ //some files $file = Array(); foreach($FILES["size"] as $key => $size){ if(intval($size, 10) === 0 && empty($FILES["tmp_name"][$key])){ //file is not selected. $file[$key] = false; continue; } if(is_uploaded_file($FILES["tmp_name"][$key]) === false){ //some kind of attack $file[$key] = false; continue; } if($FILES["error"][$key] != UPLOAD_ERR_OK){ $file[$key] = self::upload_error_message($FILES["error"][$key]); continue; } $file[$key] = Array(); $file[$key]["name"] = self::parse_filename($FILES["name"][$key], $encoding); $file[$key]["type"] = $FILES["type"][$key]; $file[$key]["size"] = intval($size, 10); $file[$key]["tmp_name"] = $FILES["tmp_name"][$key]; } }else{ //one file if(intval($FILES["size"], 10) === 0 && empty($FILES["tmp_name"])){ //file is not selected. $file = false; continue; } if(is_uploaded_file($FILES["tmp_name"]) === false){ //some kind of attack $file = false; continue; } if($FILES["error"] != UPLOAD_ERR_OK){ $file = self::upload_error_message($FILES["error"]); continue; } $file = Array(); $file["name"] = self::parse_filename($FILES["name"], $encoding); $file["type"] = $FILES["type"]; $file["size"] = intval($FILES["size"], 10); $file["tmp_name"] = $FILES["tmp_name"]; } }else{ return false; } } /*********************** private functions **************************/ ## // @return array private static function parse_filename($filename, $encoding){ $file = Array(); $file["full"] = parent::convert_encoding($filename, $encoding); $pos = mb_strrpos($file["full"], ".", 0, $encoding); if($pos !== false){ $file["extension"] = mb_substr($file["full"], $pos); $file["base"] = mb_substr($file["full"], 0, mb_strlen($file["full"]) - mb_strlen($file["extension"])); }else{ $file["extension"] = ""; $file["base"] = $file["full"]; } return $file; } ## // @return string private static function upload_error_message($error){ switch($error){ case 0: $msg = "ファイルアップロードは成功しています。"; break; case 1: $msg = "アップロードされたファイルは、サーバーの制限値を超えています。"; break; case 2: $msg = "アップロードされたファイルは、フォームで指定された制限値を超えています。"; break; case 3: $msg = "アップロードされたファイルは一部のみしかアップロードされていません。"; break; case 4: $msg = "ファイルはアップロードされませんでした。"; break; case 6: $msg = "テンポラリフォルダがありません。"; break; case 7: $msg = "ディスクへの書き込みに失敗しました。"; break; case 8: $msg = "ファイルのアップロードが停止されました。"; break; default : $msg = "原因不明のエラーが発生しました。"; break; } return $msg; } ## // @return mixed private static function methodHandler($data, $type, $options){ //type setting self::parseDataType($data, $type); //non option boolean if($type == "bool" || $type == "boolean"){ return $data; } //Option if(empty($options) === false){ self::optionSwitch($data, $options); } return $data; } ## // @return void private static function optionSwitch(&$data, $options){ if(is_array($data) === true){ foreach($data as &$_data){ self::optionSwitch($_data, $options); } unset($_data); }else{ $_options = explode(",", $options); $optionArray = Array(); foreach($_options as $_option){ if(strpos($_option, ":") !== false){ list($option_name, $option_value) = explode(":", $_option); $optionArray[trim($option_name)] = trim($option_value); }else{ $optionArray[trim($_option)] = null; } } foreach(self::$optionOrder as $excOption){ if(isset($optionArray[$excOption]) === true){ switch($excOption){ case "Raw": self::optionHandle_Raw($data, $optionArray[$excOption]); break; case "Enc": self::optionHandle_Enc($data, $optionArray[$excOption]); break; case "Format": self::optionHandle_Format($data, $optionArray[$excOption]); break; case "Max": self::optionHandle_Max($data, $optionArray[$excOption]); break; case "Min": self::optionHandle_Min($data, $optionArray[$excOption]); break; case "Between": self::optionHandle_Between($data, $optionArray[$excOption]); break; case "CutByte": self::optionHandle_CutByte($data, $optionArray[$excOption]); break; case "CutLength": self::optionHandle_CutLength($data, $optionArray[$excOption]); break; case "Entity": self::optionHandle_Entity($data, $optionArray[$excOption]); break; case "NoControl": self::optionHandle_NoControl($data, $optionArray[$excOption]); break; case "MaxByte": self::optionHandle_MaxByte($data, $optionArray[$excOption]); break; case "MinByte": self::optionHandle_MinByte($data, $optionArray[$excOption]); break; case "MaxLength": self::optionHandle_MaxLength($data, $optionArray[$excOption]); break; case "MinLength": self::optionHandle_MinLength($data, $optionArray[$excOption]); break; case "Is": self::optionHandle_Is($data, $optionArray[$excOption]); break; case "Or": self::optionHandle_Or($data, $optionArray[$excOption]); break; } } } } } ##### Option Handler ##### ## マジッククオート // @return void private static function optionHandle_Raw(&$data, $value){ if(is_string($data)){ if($value == "true"){ if(get_magic_quotes_gpc()){ if(ini_get('magic_quotes_sybase')){ $data = str_replace("''", "'", $data); }else{ $data = stripslashes($data); } } }elseif($value == "false"){ if(!get_magic_quotes_gpc()){ $data = addslashes($data); } } } } ## エンコード // @return void private static function optionHandle_Enc(&$data, $value){ if(is_string($data)){ if(strpos($value, "->") !== false){ list($from, $to) = explode("->", $value); }else{ $to = $value; $from = ""; } $data = parent::convert_encoding($data, trim($to), trim($from)); } } ## フォーマットされた文字列 // @return void private static function optionHandle_Format(&$data, $value){ if(is_bool($data) === false){ $data = sprintf($value, $data); } } ## 数値に対して、最大値を指定する // @return void private static function optionHandle_Max(&$data, $value){ if(is_int($data) === true){ $data = ($data > intval($value, 10)) ? intval($value, 10) : $data; }elseif(is_float($data) === true){ $data = ($data > floatval($value)) ? floatval($value) : $data ; } } ## 数値に対して、最小値を指定する // @return void private static function optionHandle_Min(&$data, $value){ if(is_int($data) === true){ $data = ($data < intval($value, 10)) ? intval($value, 10) : $data; }elseif(is_float($data) === true){ $data = ($data < floatval($value)) ? floatval($value) : $data ; } } ## 数値の範囲内指定(範囲外 false) // @return void private static function optionHandle_Between(&$data, $value){ if(is_int($data) === true || is_float($data) === true){ if(strpos($value, "->") !== false){ list($min, $max) = explode("->", $value); $max = floatval($max); $min = floatval($min); if($min < $max){ if($data < $min || $data > $max){ $data = false; } } } } } ## 文字列を指定されたバイトで切る // @return void private static function optionHandle_CutByte(&$data, $value){ if(is_string($data)){ if( strlen($data) > intval($value, 10)){ $data = parent::cut_byte($data, intval($value, 10)); } } } ## 文字列を指定された長さで切る // @return void private static function optionHandle_CutLength(&$data, $value){ if(is_string($data)){ if(parent::length($data) > intval($value, 10)){ $data = parent::cut_length($data, intval($value, 10)); } } } ## 文字列内のHTMLエンティティ操作 // @return void private static function optionHandle_Entity(&$data, $value){ if(is_string($data)){ if(strpos($value, "true@") !== false){ $data = htmlspecialchars($data, ENT_QUOTES, substr($value, strpos($value, "@") + 1), false); }elseif($value == "false"){ $data = htmlspecialchars_decode($data, ENT_QUOTES); } } } ## 文字列から通常使用しない制御コードを削除する(削除するコードは親クラスを参照) // @return void private static function optionHandle_NoControl(&$data, $value = null){ if(is_string($data)){ $data = parent::delete_control($data); } } ## 文字列が指定されたバイト数を超えるとfalse // @return void private static function optionHandle_MaxByte(&$data, $value){ if(is_string($data)){ if( strlen($data) > intval($value, 10) ){ $data = false; } } } ## 文字列が指定されたバイト数を下回るとfalse // @return void private static function optionHandle_MinByte(&$data, $value){ if(is_string($data)){ if( strlen($data) < intval($value, 10) ){ $data = false; } } } ## 文字列が指定された長さを超えるとfalse // @return void private static function optionHandle_MaxLength(&$data, $value){ if(is_string($data)){ if( parent::length($data) > intval($value, 10) === false){ $data = false; } } } ## 文字列が指定された長さを下回るとfalse // @return void private static function optionHandle_MinLength(&$data, $value){ if(is_string($data)){ if( parent::length($data) < intval($value, 10) === false){ $data = false; } } } ## データが指定された値かどうか true or false // @return void private static function optionHandle_Is(&$data, $value){ if(strpos($value, "@") !== false){ list($type, $is_data) = explode("@", $value); if(in_array($type, Array("integer", "int", "float", "double", "string")) === true){ self::parseDataType($is_data, $type); $data = ($data === $is_data) ? true : false; } } } ## データが指定された値の中にあるか。無いとfalse private static function optionHandle_Or(&$data, $value){ if(strpos($value, "@") !== false){ list($type, $_distinction) = explode("@", $value); if(in_array($type, Array("integer", "int", "float", "double", "string")) === true && strpos($_distinction, "|") !== false){ $distinction = explode("|", $_distinction); self::parseDataType($distinction, $type); if(in_array($data, $distinction, true) === false){ $data = false; } } } } ## convert data type ## // @param mixed(string or array) &$data // @param string $type ["boolean", "bool", "integer", "int", "float", "double", "string", "null"] // @return void private static function parseDataType(&$data, $type){ if(in_array($type, Array("boolean", "bool", "integer", "int", "float", "double", "string")) === false){ $data = false; } if(is_string($data) === true){ //especial type of Boolean if($type == "bool" || $type == "boolean"){ if(in_array(strtolower($data), self::$booleanFalseString) === true){ $data = false; }else{ $data = true; } } settype($data, $type); }elseif(is_array($data) === true){ foreach($data as &$d){ self::parseDataType($d, $type); } unset($d); } } } ?>