假设我有这个表单:
<form method="post">
<select name="s[]" multiple="multiple">
<option value="12345678">One</option>
<option value="a7e6b65e">Two</option>
<option value="ad2445f7">Three</option>
<option value="998d64fe">Four</option>
</select>
<input type="submit" value="GO">
</form>
提交表单后,我可以使用其中一个Filters函数来确保数据正常吗?我的第一个想法是filter_input_array
,但我不认为是这样。
我看到的唯一方法是,首先检查我是否有一个数组,然后循环查看值:
$s_clean = array();
if (isset($_POST['s']) && is_array($_POST['s'])) {
foreach ($_POST['s'] as $o) {
$s_clean[] = filter_var($o, FILTER_VALIDATE_REGEXP, array('options' => array('regexp' => '/^[0-9a-f]{8}$/')));
}
}
有没有更简单的方法?
数组中应该已经有了所有可能的选项值。只需验证在post中检索到的选项是否已在数组中定义。
if (!in_array($o, $options)) {
//Throw some validation error here
}
是,请参阅array_filter:http://php.net/manual/en/function.array-filter.php
在PHP 5.4中,您可以执行
$s=$_POST['s'];
if (!$s || !is_array($s)
$s=array();
else
$s=array_filter($s, function ($value) { return preg_match('/regex/',$value); });
感谢Bram和b7kich,他们各自为我提供了我将要使用的部分解决方案,因为过滤器功能在这里似乎没有帮助。
有一个可能值列表的想法很好(doh!),通过查看array_*
函数,我发现了array_intersect
,它过滤掉了任何非"有效"值。
$valid = array('12345678','a7e6b65e','ad24d5f7','998d64fe');
if (!isset($_POST['s']) || !($s = $_POST['s']) || !is_array($s))
$s_clean = array();
else
$s_clean = array_intersect($s, $valid);