php實(shí)現(xiàn)的表單驗(yàn)證類完整示例
本文實(shí)例講述了php實(shí)現(xiàn)的表單驗(yàn)證類。分享給大家供大家參考,具體如下:
<?php /** * 用法 * use Validate\Validator; * * $rules = [ * ['name|名字', 'require|email|in:7,8,9|max:10|min:6|between:6,8|length:2', '名字不能為空|名字必須必須為正確的郵件地址'], * ['test|測試', 'require'], * ]; * $data = ['name' => '8gAg:']; * $validator = new Validator($rules); * $validator->addRule(['name|名字', 'regex', '/^[0-8|a-z]+$/', '正則驗(yàn)證失敗哦']); //可以為二維數(shù)組,有|的正則驗(yàn)證只能通過addRule。 * $validator->validate($data); * $validator->getAllErrors(); //獲取所有驗(yàn)證錯(cuò)誤 array * $validator->getError(); //獲取第一條驗(yàn)證錯(cuò)誤 string * Validator::in('7,8,9', 8); //靜態(tài)調(diào)用 * Validator::isEmail('375373223@qq.com'); */ namespace Validate; class Validator { //錯(cuò)誤信息 private $error = []; //傳入的驗(yàn)證規(guī)則 private $validate = []; //需要驗(yàn)證的參數(shù) private $data = []; //添加的規(guī)則 private $add_rules = []; //默認(rèn)錯(cuò)誤提示 private $error_msg = [ 'require' => ':attribute不能為空', 'number' => ':attribute必須為數(shù)字', 'array' => ':attribute必須為數(shù)組', 'float' => ':attribute必須為浮點(diǎn)數(shù)', 'boolean' => ':attribute必須為布爾值', 'email' => ':attribute必須為正確的郵件地址', 'url' => ':attribute必須為正確的url格式', 'ip' => ':attribute必須為正確的ip地址', 'timestamp' => ':attribute必須為正確的時(shí)間戳格式', 'date' => ':attribute必須為正確的日期格式', 'regex' => ':attribute格式不正確', 'in' => ':attribute必須在:range內(nèi)', 'notIn' => ':attribute必須不在:range內(nèi)', 'between' => ':attribute必須在:1-:2范圍內(nèi)', 'notBetween' => ':attribute必須不在:1-:2范圍內(nèi)', 'max' => ':attribute最大值為:1', 'min' => ':attribute最小值為:1', 'length' => ':attribute長度必須為:1', 'confirm' => ':attribute和:1不一致', 'gt' => ':attribute必須大于:1', 'lt' => ':attribute必須小于:1', 'egt' => ':attribute必須大于等于:1', 'elt' => ':attribute必須小于等于:1', 'eq' => ':attribute必須等于:1', ]; public function __construct($validate = null) { $this->validate = $validate; } /** * [validate 驗(yàn)證] * @param [type] $data [需要驗(yàn)證的參數(shù)] * @return [type] [boolean] */ public function validate($data) { $this->data = $data; foreach ($this->validate as $key => $item) { $item_len = count($item); $name = $item[0]; $rules = $item[1]; $rules = explode('|', $rules); $message = $item_len > 2 ? explode('|', $item[2]) : null; $this->check($name, $rules, $message); } if(!empty($this->add_rules)) { $this->checkAddRules(); } return empty($this->error) ? TRUE : FALSE; } /** * [check 單個(gè)字段驗(yàn)證] * @param [type] $name [description] * @param [type] $rules [description] * @param [type] $message [description] * @return [type] [null] */ private function check($name, $rules, $message) { //$title = $name; $rule_name = $title = $name; if(strpos($name, '|')) { $rule_name = explode('|', $name)[0]; $title = explode('|', $name)[1]; } foreach ($rules as $i => $rule) { $validate_data = isset($this->data[$rule_name]) ? $this->data[$rule_name] : null; $result = $this->checkResult($rule, $validate_data); if(!$result) { $error_info = isset($message[$i]) ? $message[$i] : $this->getMessage($title, $rule); if($error_info) { array_push($this->error, $error_info); } } } } /** * [getMessage 獲取驗(yàn)證失敗的信息] * @param [type] $name [字段名] * @param [type] $rule [驗(yàn)證規(guī)則] * @return [type] [string OR fail false] */ private function getMessage($name, $rule) { $value1 = ''; $value2 = ''; $range = ''; $error_key = $rule; if(strpos($rule, ':')) { $exp_arr = explode(':', $rule); $error_key = $exp_arr[0]; $range = $exp_arr[1]; $message_value = explode(',', $exp_arr[1]); $value1 = isset($message_value[0]) ? $message_value[0] : ''; $value2 = isset($message_value[1]) ? $message_value[1] : ''; } if(isset($this->error_msg[$error_key])) { return str_replace([':attribute', ':range', ':1', ':2'], [$name, $range, $value1, $value2], $this->error_msg[$error_key]); } return false; } /** * [checkResult 字段驗(yàn)證] * @param [type] $rule [驗(yàn)證規(guī)則] * @param [type] $validate_data [需要驗(yàn)證的數(shù)據(jù)] * @return [type] [boolean] */ private function checkResult($rule, $validate_data) { switch ($rule) { case 'require': return $validate_data != ''; break; case 'number': return filter_var($validate_data, FILTER_SANITIZE_NUMBER_INT); break; case 'array': return is_array($validate_data); break; case 'float': return filter_var($validate_data, FILTER_VALIDATE_FLOAT); break; case 'boolean': return filter_var($validate_data, FILTER_VALIDATE_BOOLEAN); break; case 'email': return filter_var($validate_data, FILTER_VALIDATE_EMAIL); break; case 'url': return filter_var($validate_data, FILTER_SANITIZE_URL); case 'ip': return filter_var($validate_data, FILTER_VALIDATE_IP); break; case 'timestamp': return strtotime(date('Y-m-d H:i:s',$validate_data)) == $validate_data; break; case 'date': //2017-11-17 12:12:12 return strtotime($validate_data); break; default: if(strpos($rule, ':')) { $rule_arr = explode(':', $rule); $func_name = substr($rule, strpos($rule, ':')+1); return call_user_func_array([$this, $rule_arr[0]], [$func_name, $validate_data]); }else{ return call_user_func_array([$this, $rule], [$rule, $validate_data]); } break; } } /** * [regex 正則驗(yàn)證] * @param [type] $rule [description] * @param [type] $data [description] * @return [type] [description] */ public static function regex($rule, $data) { return filter_var($data, FILTER_VALIDATE_REGEXP, ["options" => ["regexp" => $rule]]); } /** * [addRule 添加規(guī)則格式 []] * @param [type] $rule [description] */ public function addRule($rule) { if(is_array(current($rule))) { $this->add_rules = array_merge($this->add_rules, $rule); }else{ array_push($this->add_rules, $rule); } } /** * [checkAddRules 添加新的規(guī)則的驗(yàn)證] * @return [type] [description] */ public function checkAddRules() { foreach ($this->add_rules as $key => $item) { $name = $item[0]; $message = isset($item[3]) ? $item[3] : null; $rule_name = $title = $name; if(strpos($name, '|')) { $rule_name = explode('|', $name)[0]; $title = explode('|', $name)[1]; } $validate_data = isset($this->data[$rule_name]) ? $this->data[$rule_name] : null; $result = $this->checkResult($item[1].':'.$item[2], $validate_data); if(!$result) { $error_info = isset($message) ? $message : $this->getMessage($title, $item[1]); if($error_info) { array_push($this->error, $error_info); } } } } /** * [in description] * @param [type] $rule [驗(yàn)證規(guī)則] * @param [type] $data [需要驗(yàn)證的數(shù)據(jù)] * @return [type] [boolean] */ public static function in($rule, $data) { if(!is_array($rule)) { $rule = explode(',', $rule); } return in_array($data, $rule); } /** * [in description] * @param [type] $rule [驗(yàn)證規(guī)則] * @param [type] $data [需要驗(yàn)證的數(shù)據(jù)] * @return [type] [boolean] */ public static function notIn($rule, $data) { return !$this->in($data, $rule); } /** * [in description] * @param [type] $rule [驗(yàn)證規(guī)則] * @param [type] $data [需要驗(yàn)證的數(shù)據(jù)] * @return [type] [boolean] */ public static function between($rule, $data) { $rule = explode(',', $rule); return $data >= $rule[0] && $data <= $rule[1]; } /** * [in description] * @param [type] $rule [驗(yàn)證規(guī)則] * @param [type] $data [需要驗(yàn)證的數(shù)據(jù)] * @return [type] [boolean] */ public static function notBetween($rule, $data) { return !$this->between($rule, $data); } /** * [in description] * @param [type] $rule [驗(yàn)證規(guī)則] * @param [type] $data [需要驗(yàn)證的數(shù)據(jù)] * @return [type] [boolean] */ public static function max($rule, $data) { return $data <= $rule; } /** * [in description] * @param [type] $rule [驗(yàn)證規(guī)則] * @param [type] $data [需要驗(yàn)證的數(shù)據(jù)] * @return [type] [boolean] */ public static function min($rule, $data) { return $data >= $rule; } /** * [in description] * @param [type] $rule [驗(yàn)證規(guī)則] * @param [type] $data [需要驗(yàn)證的數(shù)據(jù)] * @return [type] [boolean] */ public static function length($rule, $data) { $length = is_array($data) ? count($data) : strlen($data); return $length == $rule; } /** * [in description] * @param [type] $rule [驗(yàn)證規(guī)則] * @param [type] $data [需要驗(yàn)證的數(shù)據(jù)] * @return [type] [boolean] */ public static function confirm($rule, $data) { return isset($this->data[$rule]) && $data == $this->data[$rule]; } public static function gt($rule, $data) { return $data > $rule; } public static function lt($rule, $data) { return $data < $rule; } public static function egt($rule, $data) { return $data >= $rule; } public static function elt($rule, $data) { return $data <= $rule; } public static function eq($rule, $data) { return $data == $rule; } /** * [in 獲取驗(yàn)證失敗的第一條信息] * @return [type] [string] */ public function getError() { return count($this->error) > 0 ? $this->error[0] : null; } /** * [getAllErrors 獲取所有驗(yàn)證失敗的信息] * @return [type] [array] */ public function getAllErrors() { return $this->error; } /** * [__call 調(diào)用自定義函數(shù)或者] * @param [type] $func [驗(yàn)證規(guī)則,函數(shù)名] * @param [type] $data [驗(yàn)證數(shù)據(jù)] * @return [type] [boollean] */ function __call($func, $data) { $func_arr = get_defined_functions(); if(in_array($func,$func_arr['user'])) { return call_user_func($func, $data); }else{ array_push($this->error, '沒有' . $func . '這個(gè)方法'); } } /** * [__callStatic 靜態(tài)方法調(diào)用自定義函數(shù)或者] * @param [type] $func [驗(yàn)證規(guī)則,函數(shù)名] * @param [type] $data [驗(yàn)證數(shù)據(jù)] * @return [type] [boollean] */ public static function __callStatic($func, $data) { if(substr($func, 0, 2) == 'is') { return call_user_func_array([new self, 'checkResult'], [strtolower(substr($func, 2)), $data[0]]); } } }
PS:這里再為大家提供2款非常方便的正則表達(dá)式工具供大家參考使用:
JavaScript正則表達(dá)式在線測試工具:
http://tools.jb51.net/regex/javascript
正則表達(dá)式在線生成工具:
http://tools.jb51.net/regex/create_reg
更多關(guān)于PHP相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《php程序設(shè)計(jì)安全教程》、《php安全過濾技巧總結(jié)》、《PHP基本語法入門教程》、《php面向?qū)ο蟪绦蛟O(shè)計(jì)入門教程》、《php字符串(string)用法總結(jié)》、《php+mysql數(shù)據(jù)庫操作入門教程》及《php常見數(shù)據(jù)庫操作技巧匯總》
希望本文所述對大家PHP程序設(shè)計(jì)有所幫助。
- php封裝的表單驗(yàn)證類完整實(shí)例
- php常用表單驗(yàn)證類用法實(shí)例
- php 表單驗(yàn)證實(shí)現(xiàn)代碼
- php用戶注冊頁面利用js進(jìn)行表單驗(yàn)證具體實(shí)例
- 基于PHP+Ajax實(shí)現(xiàn)表單驗(yàn)證的詳解
- php下常用表單驗(yàn)證的正則表達(dá)式
- PHP表單驗(yàn)證內(nèi)容是否為空的實(shí)現(xiàn)代碼
- PHP Yii框架之表單驗(yàn)證規(guī)則大全
- PHP開發(fā)中常用的三個(gè)表單驗(yàn)證函數(shù)使用小結(jié)
- ThinkPHP框架表單驗(yàn)證操作方法
- PHP實(shí)現(xiàn)的用戶注冊表單驗(yàn)證功能簡單示例
相關(guān)文章
php中OR與|| AND與&&的區(qū)別總結(jié)
以下是對php中OR與|| AND與&&的區(qū)別進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過來參考下2013-10-10如何給phpcms v9增加類似于phpcms 2008中的關(guān)鍵詞表
本篇文章是對給phpcms v9增加類似于phpcms 2008中的關(guān)鍵詞表的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-07-07PHP網(wǎng)站安裝程序制作的原理、步驟、注意事項(xiàng)和示例代碼
其實(shí)PHP程序的安裝原理無非就是將數(shù)據(jù)庫結(jié)構(gòu)和內(nèi)容導(dǎo)入到相應(yīng)的數(shù)據(jù)庫中,從這個(gè)過程中重新配置連接數(shù)據(jù)庫的參數(shù)和文件,為了保證不被別人惡意使用安裝文件,當(dāng)安裝完成后需要修改安裝文件。2010-08-08PHP判斷IP并轉(zhuǎn)跳到相應(yīng)城市分站的方法
這篇文章主要介紹了PHP判斷IP并轉(zhuǎn)跳到相應(yīng)城市分站的方法,實(shí)例分析了php解析URL及跳轉(zhuǎn)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03php使用redis的有序集合zset實(shí)現(xiàn)延遲隊(duì)列應(yīng)用示例
這篇文章主要介紹了php使用redis的有序集合zset實(shí)現(xiàn)延遲隊(duì)列,結(jié)合具體實(shí)例形式分析了PHP基于redis的有序集合zset實(shí)現(xiàn)延遲隊(duì)列的具體原理、應(yīng)用場景及相關(guān)操作技巧,需要的朋友可以參考下2020-02-02PHP 數(shù)組遍歷方法大全(foreach,list,each)
php下最靈活的東西都是數(shù)組,很多數(shù)據(jù)都是通過數(shù)組的方式顯示,這里整理下數(shù)組的遍歷方法,大家可以根據(jù)需要選用。2010-06-06PHP number_format函數(shù)原理及實(shí)例解析
這篇文章主要介紹了PHP number_format函數(shù)原理及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07讓PHP以ROOT權(quán)限執(zhí)行系統(tǒng)命令的方法
這種問題我想大家可能都遇到過,網(wǎng)友提供的解決方法也很多。我也只是結(jié)合自己系統(tǒng)的需求并結(jié)合網(wǎng)友的解決方案來總結(jié)的一種方法2011-02-02PHP利用APC模塊實(shí)現(xiàn)文件上傳進(jìn)度條的方法
這篇文章主要介紹了PHP利用APC模塊實(shí)現(xiàn)文件上傳進(jìn)度條的方法,分析了APC模塊的具體用法,并給出了相關(guān)配置說明,需要的朋友可以參考下2015-01-01