我有一个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
综上所述:
- 如何使用
filter_var_array
中的一个筛选器来筛选此文件 - 如果不可能,有没有更好的方法来分析整个文件看看内容是否与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]*$/'),
)
)