WebGeeker-Validation: 一個強大的 PHP 參數驗證器

WebGeeker-Validation: 一個強大的 PHP 參數驗證器

項目地址: github 碼雲php

用於對API接口的請求參數進行合法性檢查。git

在實現服務端的API接口時,對於每個接口的每個參數,都應該檢測其取值是否合法,以避免錯誤的數據輸入到系統中。這個工做能夠說是費時費力,但又不得不作。並且PHP自己是弱類型語言,不但要驗證取值,還要驗證數據的類型是否符合,這就更復雜了。github

本工具就是針對這個工做而設計的,可以有效地減小編碼量,代碼可讀性好。web

看看下面這段代碼,能夠對用法有個大概印象,應該不難看懂:正則表達式

$params = $request->query(); // 獲取GET參數

// 驗證(若是驗證不經過,會拋出異常)
Validation::validate($params, [
    "offset" => "IntGe:0",
    "count" => "Required|IntGeLe:1,200",
]);
複製代碼

支持多種數據類型的校驗:整型、浮點型、bool型、字符串、數組、對象、文件、日期時間,可以驗證嵌套的數據結構中的參數,還支持帶條件判斷的驗證。數組

1 簡介

1.1 爲何要寫這樣一個工具?

我在使用Laravel框架的時候,Laravel提供了一個參數驗證工具,不過用起來不怎麼順暢:bash

  • 每個驗證都寫一個驗證類(繼承XXX),這樣太麻煩,並且系統中會多出許多許多的類;若是這些類在多處被複用,或者爲了「更加」複用(減小重複代碼),再在這些類之間搞出不少的繼承關係,那麼這些類的維護自己就是一個大問題;
  • 驗證器有「一詞多義」的問題。好比它有一個size驗證器,它同時支持驗證字符串、整型、文件等多種類型的參數,針對不一樣數據類型size的含義不同。這就比如你去背英語單詞,有那麼一些英語單詞,它有不少不少意思,不一樣的語境下有不一樣的含義。好比"present"這個單詞,它既有「呈現」、「出席」的意思,也有「禮物」的意思。這種一詞多義的單詞最讓人頭疼了,搞不清它到底什麼意思,並且記不住啊。

爲了解決這些問題,因此才寫了這麼一個工具。數據結構

1.2 特色

  1. 簡潔,驗證邏輯一目瞭然(參考後面的例子)
  2. 輕量,不須要定義和維護各類驗證classes
  3. 驗證器語義明確,沒有「一詞多義」的問題
  4. 支持正則表達式驗證
  5. 支持條件驗證
  6. 理論上可以支持驗證無限嵌套的參數
  7. 易學易記。好比整型驗證器都是以"Int"開頭,浮點型驗證器都是以"Float"開頭,等等。惟一不符合這一規則的是字符串型驗證器,它們一部分以"Str"開頭的,但也有一部分不以"Str"開頭,好比Regexp, Ip, Email, Url等。
  8. 不綁定任何一個框架,無任何依賴。你能夠在任何一個框架中使用這個工具,就算你不使用框架,也可使用本工具。
  9. 每一個功能特性都有單元測試(共有 41 tests, 369 assertions)

1.3 一個簡單示例

下面這個示例展現了一個查詢獲取用戶投訴列表的Request參數的驗證(用到了條件驗證和針對嵌套數據結構的驗證):composer

//驗證規則
$validations = [
    "offset" => "IntGe:0", // 參數offset應該大於等於0
    "count" => "Required|IntGeLe:1,200", // 參數count是必需的且大於等於1小於等於200
    "type" => "IntIn:1,2", // 參數type可取值爲: 1, 2
    "state" => [
        'IfIntEq:type,1|IntEq:0', // 若是type==1(批評建議),那麼參數state只能是0
        'IfIntEq:type,2|IntIn:0,1,2', // 若是type==2(用戶投訴),那麼參數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 應該是一個包含合法日期的字符串
];

// 待驗證參數
$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", // 結束日期
    ],
];

// 驗證(若是驗證不經過,會拋出異常)
Validation::validate($params, $validations);
複製代碼

2 安裝

經過Composer安裝框架

composer require webgeeker/validation:^0.4
複製代碼

3 快速上手

3.1 一個完整的示例(不使用任何框架)

這個例子直接驗證$_POST(POST表單)中的參數,展現了最基本的用法

<?php
include "vendor/autoload.php";

use WebGeeker\Validation\Validation;

try {
    Validation::validate($_POST, [
        "offset" => "IntGe:0", // 參數offset應該大於等於0
        "count" => "Required|IntGeLe:1,200", // 參數count是必需的且大於等於1小於等於200
    ]);
} catch (\Exception $e) {
    echo $e->getMessage();
}
複製代碼

注意:驗證不經過會拋出異常,該異常中包含有錯誤描述信息

3.2 驗證不經過的錯誤處理

若是驗證不經過,Validation::validate(...)方法會拋出異常,建議在框架層面統一捕獲這些異常,提取錯誤描述信息並返回給客戶端。

3.3 在第三方框架中的用法

第三方框架通常會提供Request對象,能夠取到GET, POST參數(以Laravel爲例)

//$params = $request->query(); // 獲取GET參數
$params = $request->request->all(); // 獲取POST參數

// 驗證(若是驗證不經過,會拋出異常)
Validation::validate($params, [
    // 此處省略驗證規則
]);
複製代碼

4 詳細使用方法

4.1 驗證整型參數

整型驗證器所有以"Int"開頭,用於驗證整型數值(如123)或整型字符串(如"123")。其它數據類型均不匹配。

"size" => "IntGeLe:1,100"
複製代碼

這條驗證要求參數"size"是整數,而且大於等於1,小於等於100。

完整的整型驗證器的列表參考附錄 A.1 。

4.2 驗證浮點型參數

浮點型驗證器所有以"Float"開頭,用於驗證浮點型數值(如1.0)、浮點型字符串(如"1.0")、整型數值(如123)或整型字符串(如"123")。其它數據類型均不匹配。

"height" => "FloatGeLe:0.0,100.0"
複製代碼

這條驗證要求參數"height"是浮點數,而且大於等於0,小於等於100.0。

完整的浮點型驗證器的列表參考附錄 A.2 。

4.3 驗證bool型參數

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 驗證字符串型參數

字符串型驗證器不全以"Str"開頭。只接收字符串型數據,其它數據類型均不匹配。

例1:

"name" => "StrLenGeLe:2,20"
複製代碼

這條驗證要求參數"name"是字符串,長度在2-20之間(字符串長度是用mb_strlen()來計算的)。

例2:

"comment" => "ByteLenLe:1048576"
複製代碼

這條驗證要求參數"comment"是字符串,字節長度不超過1048576(字節長度是用strlen()來計算的)。

例3:

"email" => "Email"
複製代碼

這條驗證要求參數"email"是必須是合法的電子郵件地址。

例4(正則表達式驗證):

"phone" => "Regexp:/^1(3[0-9]|4[579]|5[0-35-9]|7[0135678]|8[0-9]|66|9[89])\d{8}$/"
複製代碼

這條驗證要求參數"phone"是合法的手機號。

關於正則表達式中的哪些特殊字符須要轉義的問題,只須要用 preg_match() 函數驗證好,如:

preg_match('/^string$/', $string);
複製代碼

而後把兩個'/'號及其中間的部分拷貝出來,放在Regexp:後面便可,不須要再作額外的轉義,即便正則中有'|'這種特殊符號,也不須要再轉義。

完整的字符串型驗證器的列表參考附錄 A.4 。

4.5 驗證數組型、對象型、文件型、日期時間型參數

參考附錄A.5-A.8

4.6 驗證器串聯(與)

一條規則中能夠有多個驗證器先後串聯,它們之間是「AND」的關係,如:

"file" => "FileMaxSize:10m|FileImage"
複製代碼

這個驗證要求參數"file"是一個圖像文件,而且文件大小不超過10m

4.7 Required 驗證器

  • Required驗證器要求參數必須存在,且其值不能爲null(這個是PHP的null值,而不是字符串"null")(參數值爲null等價於參數不存在)。
  • 若是多個驗證器串聯,Required驗證器必須在其它驗證器前面。
  • 若是還有條件驗證器,Required必須串聯在條件驗證器後面。
  • 若是驗證規則中沒有 Required,當參數存在時才進行驗證,驗證不經過會拋異常;若是參數不存在,那麼就不驗證(至關於驗證經過)

例:

"size" => "Required|StrIn:small,middle,large"
複製代碼

該驗證要求參數"size"必須是字符串的"small", "middle"或者"large"。

4.8 忽略全部 Required 驗證器

好比當建立一個用戶時,要求姓名、性別、年齡所有都要提供;可是當更新用戶信息時,不須要提供所有信息,提供哪一個信息就更新哪一個信息。

$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); // 建立用戶時的驗證

unset($userInfo["age"]); // 刪除age字段
Validation::validate($userInfo, $validations, true); // 更新用戶信息時的驗證
複製代碼

注意上面代碼的最後一行:validate()函數的第三個參數爲true表示忽略全部的 Required 驗證器。

這樣咱們就只須要寫一份驗證規則,就能夠同時用於建立用戶和更新用戶信息這兩個接口。

4.9 嵌套參數的驗證

下面這個例子展現了包含數組和對象的嵌套的參數的驗證:

$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",
    ],
];
複製代碼

參數"sex"的值不一樣,參數"height"的驗證規則也不同。

完整的條件判斷型驗證器的列表參考附錄 A.9 。

4.11 驗證規則並聯(或)

多條驗證規則能夠並聯,它們之間是「或」的關係,如

"type" => [
    "StrIn:small,middle,large",
    "IntIn:1,2,3",
]
複製代碼

上面這條驗證要求參數"type"既能夠是字符串"small", "middle"或"large",也能夠整型的1, 2或3

驗證規則並聯不是簡單的「或」的關係,具體驗證流程以下:

  1. 按順序驗證這些規則,若是有一條驗證規則經過, 則該參數驗證經過。
  2. 若是所有驗證規則都被忽略(If驗證器條件不知足,或者沒有Required驗證器而且該參數不存在,或者有0條驗證規則),也算參數驗證經過。
  3. 上面兩條都不知足, 則該參數驗證失敗。

這些規則若是要徹底理清並非一件容易的事,因此不建議使用驗證規則並聯,也儘可能不要設計須要這種驗證方式的參數。

4.12 關於特殊值null, ""0false的問題

這些特殊的值是不等價的,它們是不一樣的數據類型(須要用不一樣的驗證器去驗證):

  • ""是字符串。
  • 0是整型。
  • false是bool型。
  • null是PHP的空。在本工具中它有特殊的含義。

若是某個參數的值爲null,則本工具會視爲該參數不存在。

好比下面兩個array對於本工具來講是等價的.

$params = [
    "name" => "hello",
];
複製代碼

$params = [
    "name" => "hello",
    "comment" => null,
];
複製代碼

是等價的。

4.13 關於基本數據類型與字符串的關係

對於如下url地址

http://abc.com/index.php?p1=&&p2=hello&&p3=123
複製代碼

咱們將獲得的參數數組:

$params = [
    "p1" => "",
    "p2" => "hello",
    "p3" => "123",
];
複製代碼

注意

  • 參數"p1"的值爲空字符串"",而不是null
  • 參數"p3"的值爲字符串"123",而不是整型123
  • GET方式的HTTP請求是傳遞不了null值的。

本工具的全部驗證器都是強類型的,"Int*"驗證的是整型,"Float*"驗證的是浮點型,"Str*"驗證的是字符串型,數據類型不匹配,驗證是通不過的。可是字符串類型是個例外。

由於常規的HTTP請求,全部的基本數據類型最終都會轉換成字符串,因此:

  • 整型123和字符串"123"都可以經過驗證器"Int"的驗證;
  • 浮點型123.0和字符串"123.0"都可以經過驗證器"Float"的驗證;
  • bool型true和字符串"true"都可以經過驗證器"Bool"的驗證;
  • 可是null值和字符串"null"永遠不等價,字符串"null"就只是普通的字符串。

4.14 自定義錯誤信息輸出文本

若是參數驗證不經過,Validation::validate()方法會拋出異常,這個異常會包含驗證不經過的錯誤信息描述的文本。

可是這個描述文本對用戶來講可能不那麼友好,咱們能夠經過兩個僞驗證器來自定義這些文本:

  • Alias 用於自定義參數名稱(這個名稱會與內部的錯誤信息模版相結合,生成最終的錯誤信息描述文本)
  • >>> 用於自定義錯誤描述文本(這個文本會徹底取代模版生成的錯誤描述文本)。

看下面的例子:

$params = [
    "title" => "a",
];

Validation::validate($params, [
    "title" => "Required|StrLenGeLe:2,50",
]); // 拋出異常的錯誤描述爲:「title」長度必須在 2 - 50 之間

Validation::validate($params, [
    "title" => "Required|StrLenGeLe:2,50|Alias:標題", // 自定義參數名稱
]); // 拋出異常的錯誤描述爲:「標題」長度必須在 2 - 50 之間

Validation::validate($params, [
    "title" => "Required|StrLenGeLe:2,50|>>>:標題長度應在2~50之間", // 自定義錯誤信息描述文本
]); // 拋出異常的錯誤描述爲:標題長度應在2~50之間
複製代碼

參考附錄A.10獲取更詳細的信息

4.15 國際化

從0.4版開始:

  • 使用新的靜態成員變量 $langCode2ErrorTemplates 來進行「錯誤提示信息模版」的翻譯,主要目的是簡化格式(感謝 @gitHusband 的建議)。
  • 舊的翻譯表 $langCodeToErrorTemplates 仍然有效,已有代碼無需修改(參考下一節)。若是新舊翻譯表同時提供,優先新的,新表中查不到再使用舊的。

要支持國際化,須要自定義一個類,繼承\WebGeeker\Validation\Validation,重載兩個靜態成員變量:

  • $langCode2ErrorTemplates用於提供「錯誤提示信息模版」的翻譯對照表。完整的錯誤提示信息模版列表能夠在\WebGeeker\Validation\Validation::$errorTemplates成員變量中找到
  • $langCodeToTranslations用於提供「自定義參數名稱」(由Alias指定)和「自定義錯誤描述文本」(由>>>指定)的翻譯對照表。

下面提供一個示例類:

class MyValidation extends Validation {
    // 「錯誤提示信息模版」翻譯對照表
    protected static $langCodeToErrorTemplates = [
        "zh-tw" => [
            'Int' => '「{{param}}」必須是整數', // 🌝
            '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" => [
            "變量" => "變量", // 🌙
            "變量必須是整數" => "變量必須是整數", // ⭐
        ],
        "en-us" => [
            "變量" => "variable",
            "變量必須是整數" => "variable must be an integer",
        ],
    ];
}
複製代碼

注意:

  • 語言代碼是區分大小寫的,建議所有用小寫,如"zh-cn", "en-us"等。
  • 語言代碼的名稱是自定義的,你能夠隨便起名,好比"abc"(建議使用標準的語言代碼)。

使用這個MyValidation類來進行驗證,就能夠實現文本的翻譯了。

MyValidation::setLangCode("zh-tw"); // 設置語言代碼

MyValidation::validate(["var" => 1.0], [
    "var" => "Int", // 既沒有Alias,也沒有>>>,只會翻譯錯誤提示信息模版(對應🌝那行)
]); // 會拋出異常:「var」必須是整數

MyValidation::validate(["var" => 1.0], [
    "var" => "Int|Alias:變量", // 有Alias,除了翻譯錯誤提示信息模版外,還會翻譯參數名稱(對應🌙那行)
]); // 會拋出異常:「變量」必須是整數

MyValidation::validate(["var" => 1.0], [
    "var" => "Int|>>>:變量必須是整數", // 有>>>,會翻譯自定義錯誤描述文本(對應⭐那行)
]); // 會拋出異常:變量必須是整數
複製代碼

若是提供了錯誤的語言代碼,或者沒有找到翻譯的文本,那麼就不翻譯,輸出原始的文本。

4.16 國際化(0.4版以前)

(若是你使用的是0.4及以後的版本,建議使用新的國際化方案(參考上一節),更簡潔一點)

要支持國際化,須要自定義一個類,繼承\WebGeeker\Validation\Validation,重載兩個靜態成員變量:

  • $langCodeToErrorTemplates用於提供「錯誤提示信息模版」的翻譯對照表。完整的錯誤提示信息模版列表能夠在\WebGeeker\Validation\Validation::$errorTemplates成員變量中找到
  • $langCodeToTranslations用於提供「自定義參數名稱」(由Alias指定)和「自定義錯誤描述文本」(由>>>指定)的翻譯對照表。

下面提供一個示例類:

class MyValidation extends Validation {
    // 「錯誤提示信息模版」翻譯對照表
    protected static $langCodeToErrorTemplates = [
        "zh-tw" => [
            "「{{param}}」必須是整數" => "「{{param}}」必須是整數", // 🌝
            "「{{param}}」必須是字符串" => "「{{param}}」必須是字符串",
        ],
        "en-us" => [
            "「{{param}}」必須是整數" => "{{param}} must be a integer",
            "「{{param}}」必須是字符串" => "{{param}} must be a string",
        ],
    ];

    // 文本翻譯對照表
    protected static $langCodeToTranslations = [
        "zh-tw" => [
            "變量" => "變量", // 🌙
            "變量必須是整數" => "變量必須是整數", // ⭐
        ],
        "en-us" => [
            "變量" => "variable",
            "變量必須是整數" => "variable must be an integer",
        ],
    ];
}
複製代碼

注意:

  • 語言代碼是區分大小寫的,建議所有用小寫,如"zh-cn", "en-us"等。
  • 語言代碼的名稱是自定義的,你能夠隨便起名,好比"abc"(建議使用標準的語言代碼)。

使用這個MyValidation類來進行驗證,就能夠實現文本的翻譯了。

MyValidation::setLangCode("zh-tw"); // 設置語言代碼

MyValidation::validate(["var" => 1.0], [
    "var" => "Int", // 既沒有Alias,也沒有>>>,只會翻譯錯誤提示信息模版(對應🌝那行)
]); // 會拋出異常:「var」必須是整數

MyValidation::validate(["var" => 1.0], [
    "var" => "Int|Alias:變量", // 有Alias,除了翻譯錯誤提示信息模版外,還會翻譯參數名稱(對應🌙那行)
]); // 會拋出異常:「變量」必須是整數

MyValidation::validate(["var" => 1.0], [
    "var" => "Int|>>>:變量必須是整數", // 有>>>,會翻譯自定義錯誤描述文本(對應⭐那行)
]); // 會拋出異常:變量必須是整數
複製代碼

若是提供了錯誤的語言代碼,或者沒有找到翻譯的文本,那麼就不翻譯,輸出原始的文本。

A 附錄 - 驗證器列表

A.1 整型

整型驗證器所有以"Int"開頭。

整型驗證器 示例 說明
Int Int 「{{param}}」必須是整數
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 浮點型

內部一概使用double來處理

浮點型驗證器 示例 說明
Float Float 「{{param}}」必須是浮點數
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}}」長度(字節)必須等於 {{length}}
ByteLenGe ByteLenGe:8 「{{param}}」長度(字節)必須大於等於 {{min}}
ByteLenLe ByteLenLe:8 「{{param}}」長度(字節)必須小於等於 {{max}}
ByteLenGeLe ByteLenGeLe:6,8 「{{param}}」長度(字節)必須在 {{min}} - {{max}} 之間
Letters Letters 「{{param}}」只能包含字母
Alphabet Alphabet 同Letters
Numbers Numbers 「{{param}}」只能是純數字
Digits Digits 同Numbers
LettersNumbers LettersNumbers 「{{param}}」只能包含字母和數字
Numeric Numeric 「{{param}}」必須是數值。通常用於大數處理(超過double表示範圍的數,通常會用字符串來表示)(還沒有實現大數處理), 若是是正常範圍內的數, 可使用'Int'或'Float'來檢測
VarName VarName 「{{param}}」只能包含字母、數字和下劃線,而且以字母或下劃線開頭
Email Email 「{{param}}」必須是合法的email
Url Url 「{{param}}」必須是合法的Url地址
Ip Ip 「{{param}}」必須是合法的IP地址
Mac Mac 「{{param}}」必須是合法的MAC地址
Regexp Regexp:/^abc$/ Perl正則表達式匹配

A.5 數組型

數組型驗證器 示例 說明
Arr Arr 「{{param}}」必須是數組
ArrLen ArrLen:5 「{{param}}」數組長度必須等於 {{length}}
ArrLenGe ArrLenGe:1 「{{param}}」數組長度必須大於等於 {{min}}
ArrLenLe ArrLenLe:9 「{{param}}」數組長度必須小於等於 {{max}}
ArrLenGeLe ArrLenGeLe:1,9 「{{param}}」長數組度必須在 {{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}}」必須符合日期格式YYYY-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}}」必須符合日期時間格式YYYY-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 條件判斷型

在一條驗證規則中,條件驗證器必須在其它驗證器前面,多個條件驗證器能夠串聯。

注意,條件判斷中的「條件」通常是檢測另一個參數的值,而當前參數的值是由串聯在條件判斷驗證器後面的其它驗證器來驗證。

條件判斷型驗證器 示例 說明
If If:selected 若是參數"selected"值等於 1, true, '1', 'true', 'yes'或 'y'(字符串忽略大小寫)
IfNot IfNot:selected 若是參數"selected"值等於 0, false, '0', 'false', 'no'或'n'(字符串忽略大小寫)
IfTrue IfTrue:selected 若是參數"selected"值等於 true 或 'true'(忽略大小寫)
IfFalse IfFalse:selected 若是參數"selected"值等於 false 或 'false'(忽略大小寫)
IfExist IfExist:var 若是參數"var"存在
IfNotExist IfNotExist:var 若是參數"var"不存在
IfIntEq IfIntEq:var,1 if (var === 1)
IfIntNe IfIntNe:var,2 if (var !== 2). 特別要注意的是若是條件參數var的數據類型不匹配, 那麼If條件是成立的; 而其它幾個IfIntXx當條件參數var的數據類型不匹配時, 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'). 特別要注意的是若是條件參數var的數據類型不匹配, 那麼If條件是成立的; 而其它幾個IfStrXx當條件參數var的數據類型不匹配時, 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 待驗證的參數是必需的。若是驗證器串聯,除了條件型驗證器外,必須爲第一個驗證器
Alias Alias:參數名稱 自定義錯誤提示文本中的參數名稱(必須是最後一個驗證器)
>>> >>>:這是自定義錯誤提示文本 自定義錯誤提示文本(與Alias驗證器二選一,必須是最後一個驗證器)
自定義PHP函數 function() {} 暫不提供該機制,由於若是遇到本工具不支持的複雜參數驗證,你能夠直接寫PHP代碼來驗證,不須要再經由本工具來驗證(不然就是脫褲子放屁,畫蛇添足)
相關文章
相關標籤/搜索