使用filter_var_value使用一个正则表达式过滤器过滤索引数组

时间:2017-02-10 09:28:19

标签: php arrays

我有一个包含数据行的csv文件,每行可以包含可变数量的值。 我想过滤文件的每一行,看它是否有特殊字符或错误的值,如果是,则将从整个过程中跳过该行。 所以这是我的代码:

<?php

if (($handle = fopen('file.csv', "r")) !== false) {
    while (($line = fgetcsv($handle, 1024, ";")) !== false) {
        $keys = array('key');
        foreach($line as $value){
            $arr[] = array_fill_keys($keys,$value);
        }
       $args = array('filter' => FILTER_VALIDATE_REGEXP,
                    'options' => array('regexp' => '/[a-zA-Z0-9_:.()\s-\/]*/'), );
       $result = filter_var_array($arr,$args);
       var_dump($result);

    }
}
fclose($handle);
?>

我的问题在于,作为值数组的行是一个索引数组,没有键,我试图填写键但是我仍然没有得到好的结果,而且值不会超过&#39 ;过滤。 我的第二个问题是,我想对所有值应用一个过滤器,这个过滤器是一个正则表达式,所以我不能这样做:

filter_var_array($arr,FILTER_VALIDATE_REGEXP);

因为我必须提供options

  

PHP Warning: filter_var_array(): 'regexp' option missing

这样的事情并不起作用:

filter_var_array($line,FILTER_VALIDATE_REGEXP,[ 'options' => array('regexp' => '/[a-zA-Z0-9_:.()\s-\/]*/')]);

因为filter_var_array的参数应该是2个数组和一个布尔值:

  

PHP Warning: filter_var_array() expects parameter 3 to be boolean

总结一下:

  1. 如何使用filter_var_array
  2. 中的一个过滤器过滤此文件
  3. 如果不可能,有没有更好的方法来分析整个文件 并查看内容是否与正则表达式匹配?

1 个答案:

答案 0 :(得分:1)

如果一行(数组)中有4个元素(一个,两个,三个,四个),那么你的循环:

$keys = array('key');
foreach($line as $value){
    $arr[] = array_fill_keys($keys,$value);
}

将创建:

$arr=array(
    0=>array("key"=>"one"),
    1=>array("key"=>"two"),
    2=>array("key"=>"three"),
    3=>array("key"=>"four"),
)

这似乎是多方面的不必要的。 此外,你的正则表达式注定是真的,它要求字符串中任何地方的0或更多可接受的字符。 我会做一个正则表达式模式假设并为你调整它。 试试这个:

foreach($line as $key=>$value){
    $arr["k$key"]=$value;
    $filters["k$key"]=array(
                          'filter'=>FILTER_VALIDATE_REGEXP,
                          'options'=>array('regexp'=>'/^[a-zA-Z0-9_:.()\s-\/]*$/')
                          // the regex will allow an empty string
                          // or a string of any length containing only those characters.
                      );
}
$result=filter_var_array($arr,$filters);
if(in_array(false,$result)){
    echo "Line not valid";
}else{
    var_export($result);  // with no invalid values, $result == $arr
}

这是Demo

可变输出:

$arr=array(
    'k0' => 'one',
    'k1' => 'two',
    'k2' => 'three',
    'k3' => 'four',
   )

$filter=array(
    'k0' => array(
        'filter' => 272,
        'options' => array('regexp' => '/^[a-zA-Z]*$/'),
    ),
    'k1' => array(
        'filter' => 272,
        'options' => array('regexp' => '/^[a-zA-Z]*$/'),
    ),
    'k2' => array(
        'filter' => 272,
        'options' => array('regexp' => '/^[a-zA-Z]*$/'),
    ),
    'k3' => array(
        'filter' => 272,
        'options' => array('regexp' => '/^[a-zA-Z]*$/'),
    )
)