是否可以从表单中过滤选择值数组?

时间:2013-02-15 21:36:11

标签: php

说我有这样的表格:

<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 functions来确保数据正常吗?我的第一个想法是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}$/')));
  }
}

有更简单的方法吗?

3 个答案:

答案 0 :(得分:1)

您应该已经在数组中提供了可能的选项值。 只需验证在帖子中检索的选项是否在数组中定义。

if (!in_array($o, $options)) {
    //Throw some validation error here
}

答案 1 :(得分:1)

是的,请参阅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); });  

答案 2 :(得分:0)

感谢Bram和b7kich,他们每个人都给了我解决方案的一部分,因为它不会出现过滤器功能在这里有用。

拥有可能值列表的想法很棒(doh!),并查看我找到的array_*函数array_intersect,它会过滤掉任何非有效的&#39;值。

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