WebGeeker-Validation: 一個強大的 PHP 參數(shù)驗證器
用于對API接口的請求參數(shù)進行合法性檢查丐膝。
在實現(xiàn)服務端的API接口時苗胀,對于每一個接口的每一個參數(shù),都應該檢測其取值是否合法峦朗,以免錯誤的數(shù)據(jù)輸入到系統(tǒng)中。這個工作可以說是費時費力,但又不得不做母截。而且PHP本身是弱類型語言,不但要驗證取值橄教,還要驗證數(shù)據(jù)的類型是否符合清寇,這就更復雜了。
本工具就是針對這個工作而設計的颤陶,能夠有效地減少編碼量颗管,代碼可讀性好。
看看下面這段代碼滓走,可以對用法有個大概印象垦江,應該不難看懂:
$params = $request->query(); // 獲取GET參數(shù)
// 驗證(如果驗證不通過,會拋出異常)
Validation::validate($params, [
"offset" => "IntGe:0",
"count" => "Required|IntGeLe:1,200",
]);
支持多種數(shù)據(jù)類型的校驗:整型搅方、浮點型比吭、bool型、字符串姨涡、數(shù)組衩藤、對象、文件涛漂、日期時間赏表,能夠驗證嵌套的數(shù)據(jù)結(jié)構(gòu)中的參數(shù)检诗,還支持帶條件判斷的驗證。
- 目錄
- 1 簡介
- 2 安裝
- 3 快速上手
-
4 詳細使用方法
- 4.1 驗證整型參數(shù)
- 4.2 驗證浮點型參數(shù)
- 4.3 驗證bool型參數(shù)
- 4.4 驗證字符串型參數(shù)
- 4.5 驗證數(shù)組型瓢剿、對象型逢慌、文件型、日期時間型參數(shù)
- 4.6 驗證器串聯(lián)(與)
- 4.7 Required 驗證器
- 4.8 忽略所有 Required 驗證器
- 4.9 嵌套參數(shù)的驗證
- 4.10 條件判斷型驗證器
- 4.11 驗證規(guī)則并聯(lián)(或)
- 4.12 關于特殊值
null
,""
间狂,0
攻泼,false
的問題 - 4.13 關于基本數(shù)據(jù)類型與字符串的關系
- 4.14 自定義錯誤信息輸出文本
- 4.15 國際化
- 4.16 國際化(0.4版之前)
- A 附錄 - 驗證器列表
1 簡介
1.1 為什么要寫這樣一個工具?
我在使用Laravel框架的時候,Laravel提供了一個參數(shù)驗證工具鉴象,不過用起來不怎么順暢:
- 每一個驗證都寫一個驗證類(繼承XXX)忙菠,這樣太麻煩,而且系統(tǒng)中會多出許多許多的類纺弊;如果這些類在多處被復用牛欢,或者為了“更加”復用(減少重復代碼),再在這些類之間搞出很多的繼承關系俭尖,那么這些類的維護本身就是一個大問題氢惋;
- 驗證器有“一詞多義”的問題。比如它有一個
size
驗證器稽犁,它同時支持驗證字符串焰望、整型、文件等多種類型的參數(shù)已亥,針對不同數(shù)據(jù)類型size
的含義不一樣熊赖。這就好比你去背英語單詞,有那么一些英語單詞虑椎,它有很多很多意思震鹉,不同的語境下有不同的含義。比如"present"這個單詞捆姜,它既有“呈現(xiàn)”传趾、“出席”的意思,也有“禮物”的意思泥技。這種一詞多義的單詞最讓人頭疼了浆兰,搞不清它到底什么意思,而且記不住啊珊豹。
為了解決這些問題簸呈,所以才寫了這么一個工具。
1.2 特點
- 簡潔店茶,驗證邏輯一目了然(參考后面的例子)
- 輕量蜕便,不需要定義和維護各種驗證classes
- 驗證器語義明確,沒有“一詞多義”的問題
- 支持正則表達式驗證
- 支持條件驗證
- 理論上能夠支持驗證無限嵌套的參數(shù)
- 易學易記贩幻。比如整型驗證器都是以"Int"開頭轿腺,浮點型驗證器都是以"Float"開頭两嘴,等等。唯一不符合這一規(guī)則的是字符串型驗證器吃溅,它們一部分以"Str"開頭的溶诞,但也有一部分不以"Str"開頭,比如
Regexp
,Ip
,Email
,Url
等。 - 不綁定任何一個框架,無任何依賴瓷翻。你可以在任何一個框架中使用這個工具缺虐,就算你不使用框架,也可以使用本工具功茴。
- 每個功能特性都有單元測試(共有 41 tests, 369 assertions)
1.3 一個簡單示例
下面這個示例展示了一個查詢獲取用戶投訴列表的Request參數(shù)的驗證(用到了條件驗證和針對嵌套數(shù)據(jù)結(jié)構(gòu)的驗證):
//驗證規(guī)則
$validations = [
"offset" => "IntGe:0", // 參數(shù)offset應該大于等于0
"count" => "Required|IntGeLe:1,200", // 參數(shù)count是必需的且大于等于1小于等于200
"type" => "IntIn:1,2", // 參數(shù)type可取值為: 1, 2
"state" => [
'IfIntEq:type,1|IntEq:0', // 如果type==1(批評建議)庐冯,那么參數(shù)state只能是0
'IfIntEq:type,2|IntIn:0,1,2', // 如果type==2(用戶投訴),那么參數(shù)state可取值為: 1, 2, 3
],
"search.keyword" => "StrLenGeLe:1,100", // search.keyword 應該是一個長度在[1, 100]之間的字符串
"search.start_time" => "Date", // search.start_time 應該是一個包含合法日期的字符串
"search.end_time" => "BoolSmart", // search.end_time 應該是一個包含合法日期的字符串
];
// 待驗證參數(shù)
$params = [
"offset" => 0, // 從第0條記錄開始
"count" => 10, // 最多返回10條記錄
"type" => 2, // 1-批評建議, 2-用戶投訴
"state" => 0, // 0-待處理, 1-處理中, 2-已處理
"search" => [ // 搜索條件
"keyword" => '硬件故障', // 關鍵字
"start_time" => "2018-01-01", // 起始日期
"end_time" => "2018-01-31", // 結(jié)束日期
],
];
// 驗證(如果驗證不通過坎穿,會拋出異常)
Validation::validate($params, $validations);
2 安裝
通過Composer安裝
composer require webgeeker/validation:^0.4
3 快速上手
3.1 一個完整的示例(不使用任何框架)
這個例子直接驗證$_POST
(POST表單)中的參數(shù)展父,展示了最基本的用法
<?php
include "vendor/autoload.php";
use WebGeeker\Validation\Validation;
try {
Validation::validate($_POST, [
"offset" => "IntGe:0", // 參數(shù)offset應該大于等于0
"count" => "Required|IntGeLe:1,200", // 參數(shù)count是必需的且大于等于1小于等于200
]);
} catch (\Exception $e) {
echo $e->getMessage();
}
注意:驗證不通過會拋出異常,該異常中包含有錯誤描述信息
3.2 驗證不通過的錯誤處理
如果驗證不通過玲昧,Validation::validate(...)
方法會拋出異常栖茉,建議在框架層面統(tǒng)一捕獲這些異常,提取錯誤描述信息并返回給客戶端孵延。
3.3 在第三方框架中的用法
第三方框架一般會提供Request對象吕漂,可以取到GET, POST參數(shù)(以Laravel為例)
//$params = $request->query(); // 獲取GET參數(shù)
$params = $request->request->all(); // 獲取POST參數(shù)
// 驗證(如果驗證不通過,會拋出異常)
Validation::validate($params, [
// 此處省略驗證規(guī)則
]);
4 詳細使用方法
4.1 驗證整型參數(shù)
整型驗證器全部以"Int"開頭尘应,用于驗證整型數(shù)值(如123
)或整型字符串(如"123"
)惶凝。其它數(shù)據(jù)類型均不匹配。
"size" => "IntGeLe:1,100"
這條驗證要求參數(shù)"size"是整數(shù)犬钢,并且大于等于1苍鲜,小于等于100。
完整的整型驗證器的列表參考附錄 A.1 玷犹。
4.2 驗證浮點型參數(shù)
浮點型驗證器全部以"Float"開頭混滔,用于驗證浮點型數(shù)值(如1.0
)、浮點型字符串(如"1.0"
)箱舞、整型數(shù)值(如123
)或整型字符串(如"123"
)遍坟。其它數(shù)據(jù)類型均不匹配。
"height" => "FloatGeLe:0.0,100.0"
這條驗證要求參數(shù)"height"是浮點數(shù)晴股,并且大于等于0愿伴,小于等于100.0。
完整的浮點型驗證器的列表參考附錄 A.2 电湘。
4.3 驗證bool型參數(shù)
bool型驗證器只有兩個:
- Bool: 合法的取值為:
true
,false
,"true"
,"false"
(字符串忽略大小寫)隔节。 - BoolSmart: 合法的取值為:
true
,false
,"true"
,"false"
,1
,0
,"1"
,"0"
,"yes"
,"no"
,"y"
,"n"
(字符串忽略大小寫)
例
"accept" => "BoolSmart"
完整的bool型驗證器的列表參考附錄 A.3 鹅经。
4.4 驗證字符串型參數(shù)
字符串型驗證器不全以"Str"開頭。只接收字符串型數(shù)據(jù)怎诫,其它數(shù)據(jù)類型均不匹配瘾晃。
例1:
"name" => "StrLenGeLe:2,20"
這條驗證要求參數(shù)"name"是字符串,長度在2-20之間(字符串長度是用mb_strlen()
來計算的)幻妓。
例2:
"comment" => "ByteLenLe:1048576"
這條驗證要求參數(shù)"comment"是字符串蹦误,字節(jié)長度不超過1048576(字節(jié)長度是用strlen()
來計算的)。
例3:
"email" => "Email"
這條驗證要求參數(shù)"email"是必須是合法的電子郵件地址肉津。
例4(正則表達式驗證):
"phone" => "Regexp:/^1(3[0-9]|4[579]|5[0-35-9]|7[0135678]|8[0-9]|66|9[89])\d{8}$/"
這條驗證要求參數(shù)"phone"是合法的手機號强胰。
關于正則表達式中的哪些特殊字符需要轉(zhuǎn)義的問題,只需要用 preg_match()
函數(shù)驗證好妹沙,如:
preg_match('/^string$/', $string);
然后把兩個'/'
號及其中間的部分拷貝出來偶洋,放在Regexp:
后面即可,不需要再做額外的轉(zhuǎn)義距糖,即使正則中有'|'
這種特殊符號玄窝,也不需要再轉(zhuǎn)義。
完整的字符串型驗證器的列表參考附錄 A.4 悍引。
4.5 驗證數(shù)組型恩脂、對象型、文件型吗铐、日期時間型參數(shù)
參考附錄A.5-A.8
4.6 驗證器串聯(lián)(與)
一條規(guī)則中可以有多個驗證器前后串聯(lián)东亦,它們之間是“AND”的關系,如:
"file" => "FileMaxSize:10m|FileImage"
這個驗證要求參數(shù)"file"是一個圖像文件唬渗,并且文件大小不超過10m
4.7 Required 驗證器
- Required驗證器要求參數(shù)必須存在典阵,且其值不能為
null
(這個是PHP的null
值,而不是字符串"null")(參數(shù)值為null
等價于參數(shù)不存在)镊逝。 - 如果多個驗證器串聯(lián)壮啊,Required驗證器必須在其它驗證器前面。
- 如果還有條件驗證器撑蒜,Required必須串聯(lián)在條件驗證器后面歹啼。
- 如果驗證規(guī)則中沒有 Required,當參數(shù)存在時才進行驗證座菠,驗證不通過會拋異常狸眼;如果參數(shù)不存在,那么就不驗證(相當于驗證通過)
例:
"size" => "Required|StrIn:small,middle,large"
該驗證要求參數(shù)"size"必須是字符串的"small", "middle"或者"large"浴滴。
4.8 忽略所有 Required 驗證器
比如當創(chuàng)建一個用戶時拓萌,要求姓名、性別升略、年齡全部都要提供微王;但是當更新用戶信息時屡限,不需要提供全部信息,提供哪個信息就更新哪個信息炕倘。
$validations = [
"name" => "Required|StrLenGeLe:2,20",
"sex" => "Required|IntIn:0,1",
"age" => "Required|IntGeLe:1,200",
];
$userInfo = [
"name" => "tom",
"sex" => "0",
"age" => "10",
];
Validation::validate($userInfo, $validations); // 創(chuàng)建用戶時的驗證
unset($userInfo["age"]); // 刪除age字段
Validation::validate($userInfo, $validations, true); // 更新用戶信息時的驗證
注意上面代碼的最后一行:validate()
函數(shù)的第三個參數(shù)為true表示忽略所有的 Required 驗證器钧大。
這樣我們就只需要寫一份驗證規(guī)則,就可以同時用于創(chuàng)建用戶和更新用戶信息這兩個接口罩旋。
4.9 嵌套參數(shù)的驗證
下面這個例子展示了包含數(shù)組和對象的嵌套的參數(shù)的驗證:
$params = [
"comments" => [
[
"title" => "title 1",
"content" => "content 1",
],
[
"title" => "title 1",
"content" => "content 1",
],
[
"title" => "title 1",
"content" => "content 1",
],
]
];
$validations = [
"comments[*].title" => "Required|StrLenGeLe:2,50",
"comments[*].content" => "Required|StrLenGeLe:2,500",
];
Validation::validate($params, $validations);
4.10 條件判斷型驗證器
條件判斷型驗證器都以"If"開頭啊央。
比如你想招聘一批模特,男的要求180以上瘸恼,女的要求170以上劣挫,驗證可以這樣寫:
$validations = [
"sex" => "StrIn:male,female",
"height" => [
"IfStrEq:sex,male|IntGe:180",
"IfStrEq:sex,female|IntGe:170",
],
];
參數(shù)"sex"的值不同,參數(shù)"height"的驗證規(guī)則也不一樣东帅。
完整的條件判斷型驗證器的列表參考附錄 A.9 。
4.11 驗證規(guī)則并聯(lián)(或)
多條驗證規(guī)則可以并聯(lián)球拦,它們之間是“或”的關系靠闭,如
"type" => [
"StrIn:small,middle,large",
"IntIn:1,2,3",
]
上面這條驗證要求參數(shù)"type"既可以是字符串"small", "middle"或"large",也可以整型的1, 2或3
驗證規(guī)則并聯(lián)不是簡單的“或”的關系坎炼,具體驗證流程如下:
- 按順序驗證這些規(guī)則愧膀,如果有一條驗證規(guī)則通過, 則該參數(shù)驗證通過。
- 如果全部驗證規(guī)則都被忽略(If驗證器條件不滿足谣光,或者沒有Required驗證器并且該參數(shù)不存在檩淋,或者有0條驗證規(guī)則),也算參數(shù)驗證通過萄金。
- 上面兩條都不滿足, 則該參數(shù)驗證失敗蟀悦。
這些規(guī)則如果要完全理清并不是一件容易的事,所以不建議使用驗證規(guī)則并聯(lián)氧敢,也盡量不要設計需要這種驗證方式的參數(shù)日戈。
4.12 關于特殊值null
, ""
,0
孙乖,false
的問題
這些特殊的值是不等價的浙炼,它們是不同的數(shù)據(jù)類型(需要用不同的驗證器去驗證):
-
""
是字符串。 -
0
是整型唯袄。 -
false
是bool型弯屈。 -
null
是PHP的空。在本工具中它有特殊的含義恋拷。
如果某個參數(shù)的值為null
资厉,則本工具會視為該參數(shù)不存在。
比如下面兩個array對于本工具來說是等價的.
$params = [
"name" => "hello",
];
與
$params = [
"name" => "hello",
"comment" => null,
];
是等價的梅掠。
4.13 關于基本數(shù)據(jù)類型與字符串的關系
對于以下url地址
http://abc.com/index.php?p1=&&p2=hello&&p3=123
我們將得到的參數(shù)數(shù)組:
$params = [
"p1" => "",
"p2" => "hello",
"p3" => "123",
];
注意:
- 參數(shù)"p1"的值為空字符串
""
酌住,而不是null
店归。 - 參數(shù)"p3"的值為字符串
"123"
,而不是整型123
酪我。 - GET方式的HTTP請求是傳遞不了
null
值的消痛。
本工具的所有驗證器都是強類型的,"Int"驗證的是整型都哭,"Float"驗證的是浮點型秩伞,"Str*"驗證的是字符串型,數(shù)據(jù)類型不匹配欺矫,驗證是通不過的纱新。但是字符串類型是個例外。
因為常規(guī)的HTTP請求穆趴,所有的基本數(shù)據(jù)類型最終都會轉(zhuǎn)換成字符串脸爱,所以:
- 整型
123
和字符串"123"
均可以通過驗證器"Int"的驗證; - 浮點型
123.0
和字符串"123.0"
均可以通過驗證器"Float"的驗證未妹; - bool型
true
和字符串"true"
均可以通過驗證器"Bool"的驗證簿废; - 但是
null
值和字符串"null"
永遠不等價,字符串"null"
就只是普通的字符串络它。
4.14 自定義錯誤信息輸出文本
如果參數(shù)驗證不通過族檬,Validation::validate()
方法會拋出異常,這個異常會包含驗證不通過的錯誤信息描述的文本化戳。
但是這個描述文本對用戶來說可能不那么友好单料,我們可以通過兩個偽驗證器來自定義這些文本:
-
Alias
用于自定義參數(shù)名稱(這個名稱會與內(nèi)部的錯誤信息模版相結(jié)合,生成最終的錯誤信息描述文本) -
>>>
用于自定義錯誤描述文本(這個文本會完全取代模版生成的錯誤描述文本)点楼。
看下面的例子:
$params = [
"title" => "a",
];
Validation::validate($params, [
"title" => "Required|StrLenGeLe:2,50",
]); // 拋出異常的錯誤描述為:“title”長度必須在 2 - 50 之間
Validation::validate($params, [
"title" => "Required|StrLenGeLe:2,50|Alias:標題", // 自定義參數(shù)名稱
]); // 拋出異常的錯誤描述為:“標題”長度必須在 2 - 50 之間
Validation::validate($params, [
"title" => "Required|StrLenGeLe:2,50|>>>:標題長度應在2~50之間", // 自定義錯誤信息描述文本
]); // 拋出異常的錯誤描述為:標題長度應在2~50之間
參考附錄A.10獲取更詳細的信息
4.15 國際化
從0.4版開始:
- 使用新的靜態(tài)成員變量
$langCode2ErrorTemplates
來進行“錯誤提示信息模版”的翻譯扫尖,主要目的是簡化格式(感謝 @gitHusband 的建議)。 - 舊的翻譯表
$langCodeToErrorTemplates
仍然有效盟步,已有代碼無需修改(參考下一節(jié))藏斩。如果新舊翻譯表同時提供,優(yōu)先新的却盘,新表中查不到再使用舊的狰域。
要支持國際化,需要自定義一個類黄橘,繼承\WebGeeker\Validation\Validation
兆览,重載兩個靜態(tài)成員變量:
-
$langCode2ErrorTemplates
用于提供“錯誤提示信息模版”的翻譯對照表。完整的錯誤提示信息模版列表可以在\WebGeeker\Validation\Validation::$errorTemplates
成員變量中找到 -
$langCodeToTranslations
用于提供“自定義參數(shù)名稱”(由Alias
指定)和“自定義錯誤描述文本”(由>>>
指定)的翻譯對照表塞关。
下面提供一個示例類:
class MyValidation extends Validation
{
// “錯誤提示信息模版”翻譯對照表
protected static $langCodeToErrorTemplates = [
"zh-tw" => [
'Int' => '“{{param}}”必須是整數(shù)', // ??
'IntGt' => '“{{param}}”必須大於 {{min}}',
'Str' => '“{{param}}”必須是字符串',
],
"en-us" => [
'Int' => '{{param}} must be an integer',
'IntGt' => '{{param}} must be greater than {{min}}',
'Str' => '{{param}} must be a string',
],
];
// 文本翻譯對照表
protected static $langCodeToTranslations = [
"zh-tw" => [
"變量" => "變量", // ??
"變量必須是整數(shù)" => "變量必須是整數(shù)", // ?
],
"en-us" => [
"變量" => "variable",
"變量必須是整數(shù)" => "variable must be an integer",
],
];
}
注意:
- 語言代碼是區(qū)分大小寫的抬探,建議全部用小寫,如"zh-cn", "en-us"等。
- 語言代碼的名稱是自定義的小压,你可以隨便起名线梗,比如"abc"(建議使用標準的語言代碼)。
使用這個MyValidation
類來進行驗證怠益,就可以實現(xiàn)文本的翻譯了仪搔。
MyValidation::setLangCode("zh-tw"); // 設置語言代碼
MyValidation::validate(["var" => 1.0], [
"var" => "Int", // 既沒有Alias,也沒有>>>蜻牢,只會翻譯錯誤提示信息模版(對應??那行)
]); // 會拋出異常:“var”必須是整數(shù)
MyValidation::validate(["var" => 1.0], [
"var" => "Int|Alias:變量", // 有Alias烤咧,除了翻譯錯誤提示信息模版外,還會翻譯參數(shù)名稱(對應??那行)
]); // 會拋出異常:“變量”必須是整數(shù)
MyValidation::validate(["var" => 1.0], [
"var" => "Int|>>>:變量必須是整數(shù)", // 有>>>抢呆,會翻譯自定義錯誤描述文本(對應?那行)
]); // 會拋出異常:變量必須是整數(shù)
如果提供了錯誤的語言代碼煮嫌,或者沒有找到翻譯的文本,那么就不翻譯抱虐,輸出原始的文本昌阿。
4.16 國際化(0.4版之前)
(如果你使用的是0.4及之后的版本,建議使用新的國際化方案(參考上一節(jié))恳邀,更簡潔一點)宝泵。
要支持國際化,需要自定義一個類轩娶,繼承\WebGeeker\Validation\Validation
,重載兩個靜態(tài)成員變量:
-
$langCodeToErrorTemplates
用于提供“錯誤提示信息模版”的翻譯對照表框往。完整的錯誤提示信息模版列表可以在\WebGeeker\Validation\Validation::$errorTemplates
成員變量中找到 -
$langCodeToTranslations
用于提供“自定義參數(shù)名稱”(由Alias
指定)和“自定義錯誤描述文本”(由>>>
指定)的翻譯對照表鳄抒。
下面提供一個示例類:
class MyValidation extends Validation
{
// “錯誤提示信息模版”翻譯對照表
protected static $langCodeToErrorTemplates = [
"zh-tw" => [
"“{{param}}”必須是整數(shù)" => "“{{param}}”必須是整數(shù)", // ??
"“{{param}}”必須是字符串" => "“{{param}}”必須是字符串",
],
"en-us" => [
"“{{param}}”必須是整數(shù)" => "{{param}} must be a integer",
"“{{param}}”必須是字符串" => "{{param}} must be a string",
],
];
// 文本翻譯對照表
protected static $langCodeToTranslations = [
"zh-tw" => [
"變量" => "變量", // ??
"變量必須是整數(shù)" => "變量必須是整數(shù)", // ?
],
"en-us" => [
"變量" => "variable",
"變量必須是整數(shù)" => "variable must be an integer",
],
];
}
注意:
- 語言代碼是區(qū)分大小寫的,建議全部用小寫椰弊,如"zh-cn", "en-us"等许溅。
- 語言代碼的名稱是自定義的,你可以隨便起名秉版,比如"abc"(建議使用標準的語言代碼)贤重。
使用這個MyValidation
類來進行驗證,就可以實現(xiàn)文本的翻譯了清焕。
MyValidation::setLangCode("zh-tw"); // 設置語言代碼
MyValidation::validate(["var" => 1.0], [
"var" => "Int", // 既沒有Alias并蝗,也沒有>>>,只會翻譯錯誤提示信息模版(對應??那行)
]); // 會拋出異常:“var”必須是整數(shù)
MyValidation::validate(["var" => 1.0], [
"var" => "Int|Alias:變量", // 有Alias秸妥,除了翻譯錯誤提示信息模版外滚停,還會翻譯參數(shù)名稱(對應??那行)
]); // 會拋出異常:“變量”必須是整數(shù)
MyValidation::validate(["var" => 1.0], [
"var" => "Int|>>>:變量必須是整數(shù)", // 有>>>,會翻譯自定義錯誤描述文本(對應?那行)
]); // 會拋出異常:變量必須是整數(shù)
如果提供了錯誤的語言代碼粥惧,或者沒有找到翻譯的文本键畴,那么就不翻譯,輸出原始的文本突雪。
A 附錄 - 驗證器列表
A.1 整型
整型驗證器全部以"Int"開頭起惕。
整型驗證器 | 示例 | 說明 |
---|---|---|
Int | Int | “{{param}}”必須是整數(shù) |
IntEq | IntEq:100 | “{{param}}”必須等于 {{value}} |
IntGt | IntGt:100 | “{{param}}”必須大于 {{min}} |
IntGe | IntGe:100 | “{{param}}”必須大于等于 {{min}} |
IntLt | IntLt:100 | “{{param}}”必須小于 {{max}} |
IntLe | IntLe:100 | “{{param}}”必須小于等于 {{max}} |
IntGtLt | IntGtLt:1,100 | “{{param}}”必須大于 {{min}} 小于 {{max}} |
IntGeLe | IntGeLe:1,100 | “{{param}}”必須大于等于 {{min}} 小于等于 {{max}} |
IntGtLe | IntGtLe:1,100 | “{{param}}”必須大于 {{min}} 小于等于 {{max}} |
IntGeLt | IntGeLt:1,100 | “{{param}}”必須大于等于 {{min}} 小于 {{max}} |
IntIn | IntIn:2,3,5,7,11 | “{{param}}”只能取這些值: {{valueList}} |
IntNotIn | IntNotIn:2,3,5,7,11 | “{{param}}”不能取這些值: {{valueList}} |
A.2 浮點型
內(nèi)部一律使用double來處理
浮點型驗證器 | 示例 | 說明 |
---|---|---|
Float | Float | “{{param}}”必須是浮點數(shù) |
FloatGt | FloatGt:1.0 | “{{param}}”必須大于 {{min}} |
FloatGe | FloatGe:1.0 | “{{param}}”必須大于等于 {{min}} |
FloatLt | FloatLt:1.0 | “{{param}}”必須小于 {{max}} |
FloatLe | FloatLe:1.0 | “{{param}}”必須小于等于 {{max}} |
FloatGtLt | FloatGtLt:0,1.0 | “{{param}}”必須大于 {{min}} 小于 {{max}} |
FloatGeLe | FloatGeLe:0,1.0 | “{{param}}”必須大于等于 {{min}} 小于等于 {{max}} |
FloatGtLe | FloatGtLe:0,1.0 | “{{param}}”必須大于 {{min}} 小于等于 {{max}} |
FloatGeLt | FloatGeLt:0,1.0 | “{{param}}”必須大于等于 {{min}} 小于 {{max}} |
A.3 bool型
bool型驗證器 | 示例 | 說明 |
---|---|---|
Bool | Bool | 合法的取值為: true , false , "true" , "false" (忽略大小寫) |
BoolSmart | BoolSmart | 合法的取值為: true , false , "true" , "false" , 1 , 0 , "1" , "0" , "yes" , "no" , "y" , "n" (忽略大小寫) |
A.4 字符串型
字符串型驗證器 | 示例 | 說明 |
---|---|---|
Str | Str | “{{param}}”必須是字符串 |
StrEq | StrEq:abc | “{{param}}”必須等于"{{value}}" |
StrEqI | StrEqI:abc | “{{param}}”必須等于"{{value}}"(忽略大小寫) |
StrNe | StrNe:abc | “{{param}}”不能等于"{{value}}" |
StrNeI | StrNeI:abc | “{{param}}”不能等于"{{value}}"(忽略大小寫) |
StrIn | StrIn:abc,def,g | “{{param}}”只能取這些值: {{valueList}} |
StrInI | StrInI:abc,def,g | “{{param}}”只能取這些值: {{valueList}}(忽略大小寫) |
StrNotIn | StrNotIn:abc,def,g | “{{param}}”不能取這些值: {{valueList}} |
StrNotInI | StrNotInI:abc,def,g | “{{param}}”不能取這些值: {{valueList}}(忽略大小寫) |
StrLen | StrLen:8 | “{{param}}”長度必須等于 {{length}} |
StrLenGe | StrLenGe:8 | “{{param}}”長度必須大于等于 {{min}} |
StrLenLe | StrLenLe:8 | “{{param}}”長度必須小于等于 {{max}} |
StrLenGeLe | StrLenGeLe:6,8 | “{{param}}”長度必須在 {{min}} - {{max}} 之間 |
ByteLen | ByteLen:8 | “{{param}}”長度(字節(jié))必須等于 {{length}} |
ByteLenGe | ByteLenGe:8 | “{{param}}”長度(字節(jié))必須大于等于 {{min}} |
ByteLenLe | ByteLenLe:8 | “{{param}}”長度(字節(jié))必須小于等于 {{max}} |
ByteLenGeLe | ByteLenGeLe:6,8 | “{{param}}”長度(字節(jié))必須在 {{min}} - {{max}} 之間 |
Letters | Letters | “{{param}}”只能包含字母 |
Alphabet | Alphabet | 同Letters |
Numbers | Numbers | “{{param}}”只能是純數(shù)字 |
Digits | Digits | 同Numbers |
LettersNumbers | LettersNumbers | “{{param}}”只能包含字母和數(shù)字 |
Numeric | Numeric | “{{param}}”必須是數(shù)值涡贱。一般用于大數(shù)處理(超過double表示范圍的數(shù),一般會用字符串來表示)(尚未實現(xiàn)大數(shù)處理), 如果是正常范圍內(nèi)的數(shù), 可以使用'Int'或'Float'來檢測 |
VarName | VarName | “{{param}}”只能包含字母、數(shù)字和下劃線惹想,并且以字母或下劃線開頭 |
“{{param}}”必須是合法的email | ||
Url | Url | “{{param}}”必須是合法的Url地址 |
Ip | Ip | “{{param}}”必須是合法的IP地址 |
Mac | Mac | “{{param}}”必須是合法的MAC地址 |
Regexp | Regexp:/^abc$/ | Perl正則表達式匹配 |
A.5 數(shù)組型
數(shù)組型驗證器 | 示例 | 說明 |
---|---|---|
Arr | Arr | “{{param}}”必須是數(shù)組 |
ArrLen | ArrLen:5 | “{{param}}”數(shù)組長度必須等于 {{length}} |
ArrLenGe | ArrLenGe:1 | “{{param}}”數(shù)組長度必須大于等于 {{min}} |
ArrLenLe | ArrLenLe:9 | “{{param}}”數(shù)組長度必須小于等于 {{max}} |
ArrLenGeLe | ArrLenGeLe:1,9 | “{{param}}”長數(shù)組度必須在 {{min}} ~ {{max}} 之間 |
A.6 對象型
對象型驗證器 | 示例 | 說明 |
---|---|---|
Obj | Obj | “{{param}}”必須是對象 |
A.7 文件型
文件型驗證器 | 示例 | 說明 |
---|---|---|
File | File | “{{param}}”必須是文件 |
FileMaxSize | FileMaxSize:10mb | “{{param}}”必須是文件, 且文件大小不超過{{size}} |
FileMinSize | FileMinSize:100kb | “{{param}}”必須是文件, 且文件大小不小于{{size}} |
FileImage | FileImage | “{{param}}”必須是圖片 |
FileVideo | FileVideo | “{{param}}”必須是視頻文件 |
FileAudio | FileAudio | “{{param}}”必須是音頻文件 |
FileMimes | FileMimes:mpeg,jpeg,png | “{{param}}”必須是這些MIME類型的文件:{{mimes}} |
A.8 日期和時間型
日期和時間型驗證器 | 示例 | 說明 |
---|---|---|
Date | Date | “{{param}}”必須符合日期格式Y(jié)YYY-MM-DD |
DateFrom | DateFrom:2017-04-13 | “{{param}}”不得早于 {{from}} |
DateTo | DateTo:2017-04-13 | “{{param}}”不得晚于 {{to}} |
DateFromTo | DateFromTo:2017-04-13,2017-04-13 | “{{param}}”必須在 {{from}} ~ {{to}} 之間 |
DateTime | DateTime | “{{param}}”必須符合日期時間格式Y(jié)YYY-MM-DD HH:mm:ss |
DateTimeFrom | DateTimeFrom:2017-04-13 12:00:00 | “{{param}}”不得早于 {{from}} |
DateTimeTo | DateTimeTo:2017-04-13 12:00:00 | “{{param}}”必須早于 {{to}} |
DateTimeFromTo | DateTimeFromTo:2017-04-13 12:00:00,2017-04-13 12:00:00 | “{{param}}”必須在 {{from}} ~ {{to}} 之間 |
A.9 條件判斷型
在一條驗證規(guī)則中问词,條件驗證器必須在其它驗證器前面,多個條件驗證器可以串聯(lián)勺馆。
注意戏售,條件判斷中的“條件”一般是檢測另外一個參數(shù)的值,而當前參數(shù)的值是由串聯(lián)在條件判斷驗證器后面的其它驗證器來驗證草穆。
條件判斷型驗證器 | 示例 | 說明 |
---|---|---|
If | If:selected | 如果參數(shù)"selected"值等于 1, true, '1', 'true', 'yes'或 'y'(字符串忽略大小寫) |
IfNot | IfNot:selected | 如果參數(shù)"selected"值等于 0, false, '0', 'false', 'no'或'n'(字符串忽略大小寫) |
IfTrue | IfTrue:selected | 如果參數(shù)"selected"值等于 true 或 'true'(忽略大小寫) |
IfFalse | IfFalse:selected | 如果參數(shù)"selected"值等于 false 或 'false'(忽略大小寫) |
IfExist | IfExist:var | 如果參數(shù)"var"存在 |
IfNotExist | IfNotExist:var | 如果參數(shù)"var"不存在 |
IfIntEq | IfIntEq:var,1 | if (var === 1) |
IfIntNe | IfIntNe:var,2 | if (var !== 2). 特別要注意的是如果條件參數(shù)var的數(shù)據(jù)類型不匹配, 那么If條件是成立的; 而其它幾個IfIntXx當條件參數(shù)var的數(shù)據(jù)類型不匹配時, If條件不成立 |
IfIntGt | IfIntGt:var,0 | if (var > 0) |
IfIntLt | IfIntLt:var,1 | if (var < 0) |
IfIntGe | IfIntGe:var,6 | if (var >= 6) |
IfIntLe | IfIntLe:var,8 | if (var <= 8) |
IfIntIn | IfIntIn:var,2,3,5,7 | if (in_array(var, [2,3,5,7])) |
IfIntNotIn | IfIntNotIn:var,2,3,5,7 | if (!in_array(var, [2,3,5,7])) |
IfStrEq | IfStrEq:var,waiting | if (var === 'waiting') |
IfStrNe | IfStrNe:var,editing | if (var !== 'editing'). 特別要注意的是如果條件參數(shù)var的數(shù)據(jù)類型不匹配, 那么If條件是成立的; 而其它幾個IfStrXx當條件參數(shù)var的數(shù)據(jù)類型不匹配時, If條件不成立 |
IfStrGt | IfStrGt:var,a | if (var > 'a') |
IfStrLt | IfStrLt:var,z | if (var < 'z') |
IfStrGe | IfStrGe:var,A | if (var >= '0') |
IfStrLe | IfStrLe:var,Z | if (var <= '9') |
IfStrIn | IfStrIn:var,normal,warning,error | if (in_array(var, ['normal', 'warning', 'error'], true)) |
IfStrNotIn | IfStrNotIn:var,warning,error | if (!in_array(var, ['warning', 'error'], true)) |
A.10 其它驗證器
其它驗證器 | 示例 | 說明 |
---|---|---|
Required | Required | 待驗證的參數(shù)是必需的灌灾。如果驗證器串聯(lián),除了條件型驗證器外悲柱,必須為第一個驗證器 |
Alias | Alias:參數(shù)名稱 | 自定義錯誤提示文本中的參數(shù)名稱(必須是最后一個驗證器) |
>>> | >>>:這是自定義錯誤提示文本 | 自定義錯誤提示文本(與Alias驗證器二選一锋喜,必須是最后一個驗證器) |
自定義PHP函數(shù) | function() {} | 暫不提供該機制,因為如果遇到本工具不支持的復雜參數(shù)驗證豌鸡,你可以直接寫PHP代碼來驗證嘿般,不需要再經(jīng)由本工具來驗證(否則就是脫褲子放屁,多此一舉) |