mirror of https://github.com/IoTcat/ushio-img.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
320 lines
7.4 KiB
320 lines
7.4 KiB
<?php |
|
// vim: set et sw=4 ts=4 sts=4 fdm=marker ff=unix fenc=utf8 |
|
/** |
|
* Typecho Blog Platform |
|
* |
|
* 验证类 |
|
* <code> |
|
* $test = "hello"; |
|
* $Validation = new TypechoValidation(); |
|
* $Validation->form($test, array("alpha" => "不是字符"); |
|
* var_dump($Validation->getErrorMsg()); |
|
* </code> |
|
* |
|
* @copyright Copyright (c) 2008 Typecho team (http://www.typecho.org) |
|
* @license GNU General Public License 2.0 |
|
* @version $Id: Validation.php 106 2008-04-11 02:23:54Z magike.net $ |
|
*/ |
|
|
|
/** |
|
* 验证类 |
|
* |
|
* @package Validate |
|
*/ |
|
class Typecho_Validate |
|
{ |
|
/** |
|
* 内部数据 |
|
* |
|
* @access private |
|
* @var array |
|
*/ |
|
private $_data; |
|
|
|
/** |
|
* 当前验证指针 |
|
* |
|
* @access private |
|
* @var string |
|
*/ |
|
private $_key; |
|
|
|
/** |
|
* 验证规则数组 |
|
* |
|
* @access private |
|
* @var array |
|
*/ |
|
private $_rules = array(); |
|
|
|
/** |
|
* 中断模式,一旦出现验证错误即抛出而不再继续执行 |
|
* |
|
* @access private |
|
* @var boolean |
|
*/ |
|
private $_break = false; |
|
|
|
/** |
|
* 增加验证规则 |
|
* |
|
* @access public |
|
* @param string $key 数值键值 |
|
* @param string $rule 规则名称 |
|
* @param string $message 错误字符串 |
|
* @return Typecho_Validation |
|
*/ |
|
public function addRule($key, $rule, $message) |
|
{ |
|
if (func_num_args() <= 3) { |
|
$this->_rules[$key][] = array($rule, $message); |
|
} else { |
|
$params = func_get_args(); |
|
$params = array_splice($params, 3); |
|
$this->_rules[$key][] = array_merge(array($rule, $message), $params); |
|
} |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* 设置为中断模式 |
|
* |
|
* @access public |
|
* @return void |
|
*/ |
|
public function setBreak() |
|
{ |
|
$this->_break = true; |
|
} |
|
|
|
/** |
|
* Run the Validator |
|
* This function does all the work. |
|
* |
|
* @access public |
|
* @param array $data 需要验证的数据 |
|
* @param array $rules 验证数据遵循的规则 |
|
* @return array |
|
* @throws Typecho_Validate_Exception |
|
*/ |
|
public function run(array $data, $rules = NULL) |
|
{ |
|
$result = array(); |
|
$this->_data = $data; |
|
$rules = empty($rules) ? $this->_rules : $rules; |
|
|
|
// Cycle through the rules and test for errors |
|
foreach ($rules as $key => $rules) { |
|
$this->_key = $key; |
|
$data[$key] = (is_array($data[$key]) ? 0 == count($data[$key]) |
|
: 0 == strlen($data[$key])) ? NULL : $data[$key]; |
|
|
|
foreach ($rules as $params) { |
|
$method = $params[0]; |
|
|
|
if ('required' != $method && 'confirm' != $method && 0 == strlen($data[$key])) { |
|
continue; |
|
} |
|
|
|
$message = $params[1]; |
|
$params[1] = $data[$key]; |
|
$params = array_slice($params, 1); |
|
|
|
if (!call_user_func_array(is_array($method) ? $method : array($this, $method), $params)) { |
|
$result[$key] = $message; |
|
break; |
|
} |
|
} |
|
|
|
/** 开启中断 */ |
|
if ($this->_break && $result) { |
|
break; |
|
} |
|
} |
|
|
|
return $result; |
|
} |
|
|
|
/** |
|
* 最小长度 |
|
* |
|
* @access public |
|
* @param string $str 待处理的字符串 |
|
* @param integer $length 最小长度 |
|
* @return boolean |
|
*/ |
|
public static function minLength($str, $length) |
|
{ |
|
return (Typecho_Common::strLen($str) >= $length); |
|
} |
|
|
|
/** |
|
* 验证输入是否一致 |
|
* |
|
* @access public |
|
* @param string $str 待处理的字符串 |
|
* @param string $key 需要一致性检查的键值 |
|
* @return boolean |
|
*/ |
|
public function confirm($str, $key) |
|
{ |
|
return !empty($this->_data[$key]) ? ($str == $this->_data[$key]) : empty($str); |
|
} |
|
|
|
/** |
|
* 是否为空 |
|
* |
|
* @access public |
|
* @param string $str 待处理的字符串 |
|
* @return boolean |
|
*/ |
|
public function required($str) |
|
{ |
|
return !empty($this->_data[$this->_key]); |
|
} |
|
|
|
/** |
|
* 枚举类型判断 |
|
* |
|
* @access public |
|
* @param string $str 待处理的字符串 |
|
* @param array $params 枚举值 |
|
* @return unknown |
|
*/ |
|
public static function enum($str, array $params) |
|
{ |
|
$keys = array_flip($params); |
|
return isset($keys[$str]); |
|
} |
|
|
|
/** |
|
* Max Length |
|
* |
|
* @param $str |
|
* @param $length |
|
* @return bool |
|
*/ |
|
public static function maxLength($str, $length) |
|
{ |
|
return (Typecho_Common::strLen($str) < $length); |
|
} |
|
|
|
/** |
|
* Valid Email |
|
* |
|
* @access public |
|
* @param string |
|
* @return boolean |
|
*/ |
|
public static function email($str) |
|
{ |
|
return preg_match("/^[_a-z0-9-\.]+@([-a-z0-9]+\.)+[a-z]{2,}$/i", $str); |
|
} |
|
|
|
/** |
|
* 验证是否为网址 |
|
* |
|
* @access public |
|
* @param string $str |
|
* @return boolean |
|
*/ |
|
public static function url($str) |
|
{ |
|
$parts = @parse_url($str); |
|
if (!$parts) { |
|
return false; |
|
} |
|
|
|
return isset($parts['scheme']) && |
|
in_array($parts['scheme'], array('http', 'https', 'ftp')) && |
|
!preg_match('/(\(|\)|\\\|"|<|>|[\x00-\x08]|[\x0b-\x0c]|[\x0e-\x19])/', $str); |
|
} |
|
|
|
/** |
|
* Alpha |
|
* |
|
* @access public |
|
* @param string |
|
* @return boolean |
|
*/ |
|
public static function alpha($str) |
|
{ |
|
return preg_match("/^([a-z])+$/i", $str) ? true : false; |
|
} |
|
|
|
/** |
|
* Alpha-numeric |
|
* |
|
* @access public |
|
* @param string |
|
* @return boolean |
|
*/ |
|
public static function alphaNumeric($str) |
|
{ |
|
return preg_match("/^([a-z0-9])+$/i", $str); |
|
} |
|
|
|
/** |
|
* Alpha-numeric with underscores and dashes |
|
* |
|
* @access public |
|
* @param string |
|
* @return boolean |
|
*/ |
|
public static function alphaDash($str) |
|
{ |
|
return preg_match("/^([_a-z0-9-])+$/i", $str) ? true : false; |
|
} |
|
|
|
/** |
|
* 对xss字符串的检测 |
|
* |
|
* @access public |
|
* @param string $str |
|
* @return boolean |
|
*/ |
|
public static function xssCheck($str) |
|
{ |
|
$search = 'abcdefghijklmnopqrstuvwxyz'; |
|
$search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; |
|
$search .= '1234567890!@#$%^&*()'; |
|
$search .= '~`";:?+/={}[]-_|\'\\'; |
|
|
|
for ($i = 0; $i < strlen($search); $i++) { |
|
// ;? matches the ;, which is optional |
|
// 0{0,7} matches any padded zeros, which are optional and go up to 8 chars |
|
|
|
// @ @ search for the hex values |
|
$str = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $str); // with a ; |
|
// @ @ 0{0,7} matches '0' zero to seven times |
|
$str = preg_replace('/(�{0,8}'.ord($search[$i]).';?)/', $search[$i], $str); // with a ; |
|
} |
|
|
|
return !preg_match('/(\(|\)|\\\|"|<|>|[\x00-\x08]|[\x0b-\x0c]|[\x0e-\x19]|' . "\r|\n|\t" . ')/', $str); |
|
} |
|
|
|
/** |
|
* Numeric |
|
* |
|
* @access public |
|
* @param integer |
|
* @return boolean |
|
*/ |
|
public static function isFloat($str) |
|
{ |
|
return preg_match("/^[0-9\.]+$/", $str); |
|
} |
|
|
|
/** |
|
* Is Numeric |
|
* |
|
* @access public |
|
* @param string |
|
* @return boolean |
|
*/ |
|
public static function isInteger($str) |
|
{ |
|
return is_numeric($str); |
|
} |
|
}
|
|
|