0

假设我有这个表格:

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

提交表单后,我可以使用其中一个过滤器功能来确保数据正常吗?我的第一个想法是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}$/')));
  }
}

有没有更简单的方法?

4

3 回答 3

1

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

if (!in_array($o, $options)) {
    //Throw some validation error here
}
于 2013-02-15T21:43:08.890 回答
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); });  
于 2013-02-15T21:43:37.813 回答
0

感谢 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);
于 2013-02-18T13:27:59.960 回答