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.
350 lines
7.8 KiB
350 lines
7.8 KiB
<?php
|
|
|
|
/**
|
|
* 表单类
|
|
*/
|
|
|
|
namespace libraries;
|
|
|
|
class Form {
|
|
|
|
/**
|
|
* 表单数据
|
|
* @var array
|
|
*/
|
|
protected $data = array();
|
|
|
|
/**
|
|
* 错误消息
|
|
* @var string
|
|
*/
|
|
protected $errorMsg = '';
|
|
|
|
/**
|
|
* 构建函数
|
|
* @param array $data 表单数据
|
|
*/
|
|
public function __construct($data = array()) {
|
|
if(empty($data)) {
|
|
$data = array_merge((array)$_GET, (array)$_POST);
|
|
}
|
|
$this->data = $this->filterData($data);
|
|
}
|
|
|
|
/**
|
|
* 过滤数据
|
|
* @param array $data 数据
|
|
* @return array
|
|
*/
|
|
protected function filterData($data) {
|
|
if (is_array($data)){
|
|
foreach ($data as $k=>$v){
|
|
$data[$k] = $this->filterData($v);
|
|
}
|
|
return $data;
|
|
}else{
|
|
//还原自动转义
|
|
if(get_magic_quotes_gpc()) {
|
|
$data = stripslashes($data);
|
|
}
|
|
return $this->htmlEncode($data, 1);
|
|
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 设置表单数据
|
|
* @param array $data 表单数据
|
|
*/
|
|
public function setData($data = array()) {
|
|
$this->data = $data;
|
|
}
|
|
|
|
/**
|
|
* 获取字段名或变量
|
|
* @param array $data 表单数据
|
|
*/
|
|
public function getData($field, $type = 0) {
|
|
if($type){
|
|
$data = $field;
|
|
}else{
|
|
$data = $this->data[$field];
|
|
}
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* 获取请求值
|
|
* @param string $name 键名
|
|
* @param string $default 默认值
|
|
* @return mixed
|
|
*/
|
|
public function getVal($name = null, $default = null){
|
|
if(empty($name)){
|
|
return $this->data;
|
|
}
|
|
if(!isset($this->data[$name])){
|
|
return $default;
|
|
}
|
|
return $this->data[$name];
|
|
}
|
|
|
|
/**
|
|
* 判断数组
|
|
* @param sting $field 字段名
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isArray($field, $type = 0){
|
|
$data = $this->getData($field, $type);
|
|
if(is_array($data)){
|
|
if(empty($data)){
|
|
return false;
|
|
}else{
|
|
return true;
|
|
}
|
|
}else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 判断不为空
|
|
* @param sting $field 字段名
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isEmpty($field, $type = 0){
|
|
$data = $this->getData($field, $type);
|
|
if(!empty($data)){
|
|
return true;
|
|
}else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 判断邮箱
|
|
* @param sting $field 字段名
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isEmail($field, $type = 0){
|
|
$this->isPreg('/^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/', $field, $type);
|
|
}
|
|
|
|
/**
|
|
* 判断网址
|
|
* @param sting $field 字段名
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isUrl($field, $type = 0){
|
|
$this->isPreg('/^http(s?):\/\/(?:[A-za-z0-9-]+\.)+[A-za-z]{2,4}(:\d+)?(?:[\/\?#][\/=\?%\-&~`@[\]\':+!\.#\w]*)?$/', $field, $type);
|
|
}
|
|
|
|
/**
|
|
* 判断货币
|
|
* @param sting $field 字段名
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isCurrency($field, $type = 0){
|
|
$this->isPreg('/^\d+(\.\d+)?$/', $field, $type);
|
|
}
|
|
|
|
/**
|
|
* 判断数字
|
|
* @param sting $field 字段名
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isNumber($field, $type = 0){
|
|
$this->isPreg('/^\d+$/', $field, $type);
|
|
}
|
|
|
|
/**
|
|
* 判断区号
|
|
* @param sting $field 字段名
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isZip($field, $type = 0){
|
|
$this->isPreg('/^\d{6}$/', $field, $type);
|
|
}
|
|
|
|
/**
|
|
* 判断整数
|
|
* @param sting $field 字段名
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isInteger($field, $type = 0){
|
|
$this->isPreg('/^[-\+]?\d+$/', $field, $type);
|
|
}
|
|
|
|
/**
|
|
* 判断浮点数
|
|
* @param sting $field 字段名
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isDouble($field, $type = 0){
|
|
$this->isPreg('/^[-\+]?\d+$/', $field, $type);
|
|
}
|
|
|
|
/**
|
|
* 判断英文
|
|
* @param sting $field 字段名
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isEnglish($field, $type = 0){
|
|
$this->isPreg('/^[A-Za-z]+$/', $field);
|
|
}
|
|
|
|
/**
|
|
* 判断长度
|
|
* @param sting $field 字段名
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isLength($field, $len, $type = 0){
|
|
$length = mb_strlen($this->data[$field],'utf-8');
|
|
if(strpos($rule,',')) {
|
|
list($min,$max) = explode(',',$rule);
|
|
if($length >= $min && $length <= $max){
|
|
return true;
|
|
}
|
|
}else{
|
|
if($length == $rule){
|
|
return false;
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 判断正则
|
|
* @param sting $rule 规则
|
|
* @param sting $field 字段
|
|
* @param type $type 字段类型
|
|
* @return boolean
|
|
*/
|
|
public function isPreg($rule, $field, $type = 0){
|
|
$data = $this->getData($field, $type);
|
|
if(preg_match($rule, $data) === 1){
|
|
return true;
|
|
}else{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
/**
|
|
* html转换字符串
|
|
* @param string $field 字段名/HTML内容
|
|
* @param type $type 字段类型
|
|
* @return string
|
|
*/
|
|
public function htmlEncode($field, $type = 0){
|
|
$data = $this->getData($field, $type);
|
|
return htmlspecialchars($data, ENT_QUOTES, 'UTF-8');
|
|
}
|
|
|
|
/**
|
|
* 字符串转换html
|
|
* @param string $field 字段名/HTML内容
|
|
* @param type $type 字段类型
|
|
* @return string
|
|
*/
|
|
public function htmlDecode($field, $type = 0){
|
|
$data = $this->getData($field, $type);
|
|
return html_entity_decode($data, ENT_QUOTES, 'UTF-8');
|
|
}
|
|
|
|
/**
|
|
* 清理HTML
|
|
* @param string $field 字段名/HTML内容
|
|
* @param type $type 字段类型
|
|
* @return string
|
|
*/
|
|
public function filterHtml($field, $type = 0){
|
|
$data = $this->getData($field, $type);
|
|
$html = $this->htmlDecode($data, 1);
|
|
return strip_tags($html);
|
|
}
|
|
|
|
/**
|
|
* 过滤非HTTP协议
|
|
* @param string $field 字段名/URI地址
|
|
* @param type $type 字段类型
|
|
* @return string
|
|
*/
|
|
public function filterUri($field, $type = 0) {
|
|
$data = $this->getData($field, $type);
|
|
$uri = $this->htmlDecode($data, 1);
|
|
$allowed_protocols = array('http' => true, 'https' => true);
|
|
do {
|
|
$before = $uri;
|
|
$colonpos = strpos($uri, ':');
|
|
if ($colonpos > 0) {
|
|
$protocol = substr($uri, 0, $colonpos);
|
|
if (preg_match('![/?#]!', $protocol)) {
|
|
break;
|
|
}
|
|
if (!isset($allowed_protocols[strtolower($protocol)])) {
|
|
$uri = substr($uri, $colonpos + 1);
|
|
}
|
|
}
|
|
} while ($before != $uri);
|
|
|
|
return $uri;
|
|
}
|
|
|
|
/**
|
|
* 过滤XSS
|
|
* @param string $field 字段名/HTML内容
|
|
* @return string
|
|
*/
|
|
public function filterXss($field, $allowedTags = array(), $allowedStyleProperties = array(), $type = 0) {
|
|
static $xss;
|
|
if(!isset($xss)) {
|
|
$xss = new \framework\ext\Xss();
|
|
}
|
|
$data = $this->getData($field, $type);
|
|
$html = $this->htmlDecode($data, 1);
|
|
return $xss->filter($html, $allowedTags, $allowedStyleProperties);
|
|
}
|
|
|
|
/**
|
|
* 获取生成令牌
|
|
* @param string $key 密钥
|
|
* @return string
|
|
*/
|
|
public function tokenGet($key) {
|
|
static $encrypter;
|
|
if(!isset($encrypter)) {
|
|
$encrypter = new \framework\ext\Encrypter($key);
|
|
}
|
|
return $encrypter->encrypt($encrypter->getId());
|
|
}
|
|
|
|
/**
|
|
* 验证令牌
|
|
* @param string $str 提交令牌
|
|
* @param string $key 密钥
|
|
* @return string
|
|
*/
|
|
public function tokenVerify($str, $key) {
|
|
static $encrypter;
|
|
if(!isset($encrypter)) {
|
|
$encrypter = new \framework\ext\Encrypter($key);
|
|
}
|
|
$code = $encrypter->decrypt($str);
|
|
if(!$encrypter->isId($uuid)){
|
|
return false;
|
|
}
|
|
return $code;
|
|
|
|
}
|
|
|
|
}
|