WebGeeker-Validation: 一個強大的 PHP 參數(shù)驗證器

WebGeeker-Validation: 一個強大的 PHP 參數(shù)驗證器

項目地址: github 碼云

用于對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 簡介

1.1 為什么要寫這樣一個工具?

我在使用Laravel框架的時候,Laravel提供了一個參數(shù)驗證工具鉴象,不過用起來不怎么順暢:

  • 每一個驗證都寫一個驗證類(繼承XXX)忙菠,這樣太麻煩,而且系統(tǒng)中會多出許多許多的類纺弊;如果這些類在多處被復用牛欢,或者為了“更加”復用(減少重復代碼),再在這些類之間搞出很多的繼承關系俭尖,那么這些類的維護本身就是一個大問題氢惋;
  • 驗證器有“一詞多義”的問題。比如它有一個size驗證器稽犁,它同時支持驗證字符串焰望、整型、文件等多種類型的參數(shù)已亥,針對不同數(shù)據(jù)類型size的含義不一樣熊赖。這就好比你去背英語單詞,有那么一些英語單詞虑椎,它有很多很多意思震鹉,不同的語境下有不同的含義。比如"present"這個單詞捆姜,它既有“呈現(xiàn)”传趾、“出席”的意思,也有“禮物”的意思泥技。這種一詞多義的單詞最讓人頭疼了浆兰,搞不清它到底什么意思,而且記不住啊珊豹。

為了解決這些問題簸呈,所以才寫了這么一個工具。

1.2 特點

  1. 簡潔店茶,驗證邏輯一目了然(參考后面的例子)
  2. 輕量蜕便,不需要定義和維護各種驗證classes
  3. 驗證器語義明確,沒有“一詞多義”的問題
  4. 支持正則表達式驗證
  5. 支持條件驗證
  6. 理論上能夠支持驗證無限嵌套的參數(shù)
  7. 易學易記贩幻。比如整型驗證器都是以"Int"開頭轿腺,浮點型驗證器都是以"Float"開頭两嘴,等等。唯一不符合這一規(guī)則的是字符串型驗證器吃溅,它們一部分以"Str"開頭的溶诞,但也有一部分不以"Str"開頭,比如Regexp, Ip, Email, Url等。
  8. 不綁定任何一個框架,無任何依賴瓷翻。你可以在任何一個框架中使用這個工具缺虐,就算你不使用框架,也可以使用本工具功茴。
  9. 每個功能特性都有單元測試(共有 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)不是簡單的“或”的關系坎炼,具體驗證流程如下:

  1. 按順序驗證這些規(guī)則愧膀,如果有一條驗證規(guī)則通過, 則該參數(shù)驗證通過。
  2. 如果全部驗證規(guī)則都被忽略(If驗證器條件不滿足谣光,或者沒有Required驗證器并且該參數(shù)不存在檩淋,或者有0條驗證規(guī)則),也算參數(shù)驗證通過萄金。
  3. 上面兩條都不滿足, 則該參數(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ù)字和下劃線惹想,并且以字母或下劃線開頭
Email Email “{{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)由本工具來驗證(否則就是脫褲子放屁,多此一舉)
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末涯冠,一起剝皮案震驚了整個濱河市蛇更,隨后出現(xiàn)的幾起案子派任,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件屈暗,死亡現(xiàn)場離奇詭異爽室,居然都是意外死亡啸箫,警方通過查閱死者的電腦和手機扎唾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人咐蚯,你說我怎么就攤上這事危尿。” “怎么了粤铭?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長怯屉。 經(jīng)常有香客問我锨络,道長礼患,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任宋舷,我火速辦了婚禮,結(jié)果婚禮上幻碱,老公的妹妹穿的比我還像新娘绎狭。我一直安慰自己,他們只是感情好褥傍,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布儡嘶。 她就那樣靜靜地躺著,像睡著了一般恍风。 火紅的嫁衣襯著肌膚如雪蹦狂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天朋贬,我揣著相機與錄音凯楔,去河邊找鬼。 笑死锦募,一個胖子當著我的面吹牛摆屯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播糠亩,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼虐骑,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赎线?” 一聲冷哼從身側(cè)響起廷没,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎垂寥,沒想到半個月后腕柜,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡矫废,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砰蠢。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蓖扑。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖台舱,靈堂內(nèi)的尸體忽然破棺而出律杠,到底是詐尸還是另有隱情潭流,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布柜去,位于F島的核電站灰嫉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏嗓奢。R本人自食惡果不足惜讼撒,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望股耽。 院中可真熱鬧根盒,春花似錦撼唾、人聲如沸缓呛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽诬乞。三九已至册赛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間震嫉,已是汗流浹背森瘪。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留责掏,地道東北人柜砾。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像换衬,于是被迫代替她去往敵國和親痰驱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)瞳浦,也就是一...
    悟名先生閱讀 4,153評論 0 13
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,007評論 6 13
  • 1 2016年8月29日叫潦,全中國的朋友圈被一句話給刷屏了蝇完,這...
    w王大銘閱讀 414評論 0 0
  • 青海,給我的第一印象就是草原矗蕊,連綿不斷的山脈短蜕,在幽藍的天穹與黛綠的草原間,一望無際傻咖,偶爾有像巨人矗立起來的山峰朋魔。 ...
    絲路花雨_a690閱讀 188評論 0 1