使用Filter_var_value使用一个正则表达式筛选器筛选索引数组



我有一个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);
?>

我的问题是,作为值数组的行是一个索引数组,没有键,我试图填充键,但仍然没有得到好的结果,值也没有被过滤。我的第二个问题是,我想对所有值应用一个过滤器,这个过滤器是一个正则表达式,所以我不能这样做:

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. 如果不可能,有没有更好的方法来分析整个文件看看内容是否与regexp匹配

如果一行(数组)中有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"),
)

这似乎是不必要的多层面。此外,您的regex注定是true,它要求字符串中任何位置都有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
}

这是一个演示。

可变输出:

$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]*$/'),
)
)

最新更新