我需要验证从HTTP请求(通常来自$ _POST和$ _GET)收到的一些值与其相关的预期类型。
以下是如何定义可能的参数:
$defs = [
'op' => [ 'type' => 'string' ],
'out' => [ 'type' => 'integer'],
'throttle' => [ 'type' => 'double']
];
PHP提供了filter_var()函数,它实际上清理了值,但没有告诉格式是否有效。
有没有其他方法可以实现这一点,而无需为每种可能的类型(字符串,布尔值,整数,浮点数,双精度数组,数组)编写正则表达式?
答案 0 :(得分:1)
由于我不太可能找到进一步开发我的图书馆的时间,我正在提供另一个图书馆供使用 Respect/Validation(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中,您需要尝试/捕获错误和使用不同的验证方法 - assert
。见下文。
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>";
}
}
}
在上面的示例中,捕获了错误。 R / V使用getMessages
返回所有错误的数组。我用它来迭代它们然后打印它们。
我创建了一个WIP库:https://github.com/JustCarty/Validator
如果我已正确理解了这个问题,那么你会像这样使用它:
$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>";
}
}
op 没关系 out 不好吧 throttle 没关系
它像任何其他类一样初始化。只需创建一个变量并使用new
关键字
如您在示例中所见,它是可链接的。
foreach循环将循环遍历您的定义,并将变量(或字符串)的名称存储在名为$name
的变量中,将变量中的设置数组存储在$settings
中。
第一步是清除以前的错误。这是因为我们没有初始化每次迭代,我们保持相同的实例并更改其属性。
下一个方法是setDataType
。我们访问settings数组的type属性,然后设置此验证的数据类型
下一个方法看起来很奇怪。双美元符号将按以下方式评估(我使用第一次迭代作为示例):
$$name;
$op; // outputs "test"
您可以详细了解double dollar here。
可以在失败的if语句中访问错误。例如,您可以致电$v->error
,$v->errno
或$v->errorList
分别检索上一个错误,错误编号或所有错误。
图书馆中还有其他一些选项 请注意,它是 WIP ,因此可能存在一些问题。
我还会在某个时间点创建自述文件......
答案 1 :(得分:0)
更好地使用filter_var
功能
这里的文档:http://php.net/manual/en/function.filter-var.php
答案 2 :(得分:0)
当你只想检查某些东西的类型时,PHP有两种方法。您可以使用gettype
函数(请参阅示例)或is_TYPE
函数(TYPE是占位符)。在这里,您可以看到is_TYPE函数的完整列表。 http://php.net/manual/en/book.var.php
$defs = [
'op' => [ 'type' => 'string' ],
'out' => [ 'type' => 'integer'],
'throttle' => [ 'type' => 'double']
];
$in = [
'op' => 'test',
'out' => 123,
'throttle' => 1.234
];
foreach ($in as $k => $v) {
var_dump(gettype($v) === $defs[$k]['type']);
}