Php 如何根据预期类型检查数据有效性?

Php 如何根据预期类型检查数据有效性?,php,validation,Php,Validation,我需要根据HTTP请求(通常来自$\u POST和$\u GET)的相关预期类型验证从HTTP请求接收到的一些值 以下是如何定义可能的参数: $defs = [ 'op' => [ 'type' => 'string' ], 'out' => [ 'type' => 'integer'], 'throttle' => [ 'type' => 'double'] ]; PHP提供了filter_var()函数,该函数实际上对值进行清理,

我需要根据HTTP请求(通常来自$\u POST和$\u GET)的相关预期类型验证从HTTP请求接收到的一些值

以下是如何定义可能的参数:

$defs = [ 
'op'       => [ 'type' => 'string' ],
'out'      => [ 'type' => 'integer'],
'throttle' => [ 'type' => 'double']
];
PHP提供了filter_var()函数,该函数实际上对值进行清理,但不判断格式是否有效


是否有其他方法可以实现这一点,而不必为每种可能的类型(字符串、布尔值、整数、浮点值、双精度、数组)编写正则表达式?

更好地使用
filter\u var
函数。

这里的文档:

当您只想检查某物的类型时,PHP中有两种方法。您可以使用
gettype
函数(参见示例)或
is\u TYPE
函数(TYPE是占位符)。在这里您可以看到is_类型函数的完整列表

编辑 由于我不太可能有时间进一步开发我的库,我将提供另一个库供使用。
(R/V)有很多功能可供使用,现在可以使用了;也就是说,这项工作不像我的工作那样在进行中

这里是相同的工作示例,但使用R/V

use Respect\Validation\Validator as v;

// these are from your POST, I think
$op = "test";
$out = 10.5;
$throttle = 10.5;

$defs = [ 
    "op"       => ["type" => "string"],
    "out"      => ["type" => "integer"],
    "throttle" => ["type" => "double"]
];

foreach ($defs as $name => $settings) {
    if (v::type($settings["type"])->validate($$name)) {
        echo "<p><i>$name</i> is okay</p>";
    } else {
        echo "<p><i>$name</i> is <b>not</b> okay</p>";
    }
}
在上面的示例中,捕获错误。R/V使用
getMessages
返回所有错误的数组。我用它来迭代并打印它们


原始答案如下 我创建了一个WIP库:

实例 如果我正确理解了这个问题,那么您可以这样使用它:

$v = new Validator();

// these are from your POST, I think
$op = "test";
$out = 10.5;
$throttle = 10.5;

$defs = [ 
    "op"       => ["type" => "string"],
    "out"      => ["type" => "integer"],
    "throttle" => ["type" => "double"]
];

foreach ($defs as $name => $settings) {
    if ($v->clearErrors()->setDataType($settings["type"])->validate($$name)) {
        echo "<p><i>$name</i> is okay</p>";
    } else {
        echo "<p><i>$name</i> is <b>not</b> okay</p>";
    }
}
你可以阅读更多关于这本书的内容

在failed if语句中可以访问错误。例如,您可以调用
$v->error
$v->errno
,或
$v->errorList
,分别检索最后一个错误、错误号或所有错误

免责声明 库中还提供了一些其他选项。
请注意,它是WIP,因此可能存在一些问题


我还将在某个时间点创建自述文件…

因此,您的意思是有必要为每个预期类型选择适当的筛选器。此外,您还可以使用
preg\u match
验证如果有人已经实现了这一点,他能提供一个示例吗?谢谢
foreach ($defs as $name => $settings) {
    try {
        v::type($settings["type"])->assert($$name);
        echo "<p>No problem</p>";
    } catch (Respect\Validation\Exceptions\ExceptionInterface $ex) {
        foreach ($ex->getMessages() as $error) {
            echo "<p>$error</p>";
        }
    }
}
$v = new Validator();

// these are from your POST, I think
$op = "test";
$out = 10.5;
$throttle = 10.5;

$defs = [ 
    "op"       => ["type" => "string"],
    "out"      => ["type" => "integer"],
    "throttle" => ["type" => "double"]
];

foreach ($defs as $name => $settings) {
    if ($v->clearErrors()->setDataType($settings["type"])->validate($$name)) {
        echo "<p><i>$name</i> is okay</p>";
    } else {
        echo "<p><i>$name</i> is <b>not</b> okay</p>";
    }
}
$$name;
$op; // outputs "test"