是否可以从表单中筛选一个选择值数组


Is it possible to filter an array of select values from a form?

假设我有这个表单:

<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);