我想确保我们的客户上传的CSV文件确实是PHP中的CSV文件。我正在处理上传本身就好了。我并不担心恶意用户,但我担心会尝试上传Excel工作簿。除非我弄错了,否则Excel工作簿和CSV仍然可以使用相同的MIME,因此检查不够好。
是否有一个正则表达式可以处理验证CSV文件真的是一个CSV文件? (我不需要解析......这就是PHP的fgetcsv()所用的。)我见过几个,但是它们之后通常会出现“它不适用于X案例”之类的评论。
还有其他更好的处理方法吗?
(我希望CSV能够保存名字/姓氏,部门名称......没什么特别的。)
答案 0 :(得分:6)
与其他文件格式不同,CSV在文件头中没有任何字节。它立即开始实际数据。
我没有看到任何方法,除了实际解析它,并计算结果中是否有预期的列数。
读取确定第一行所需的字符数可能就足够了(=直到第一个换行符。)
答案 1 :(得分:3)
您可以编写一个可以猜测文件是否为有效CSV的RE - 但也许更好的方法是尝试解析文件,就好像它是CSV(使用您的fgetcsv()调用),并假设如果呼叫失败,它不是有效的?
换句话说,查看文件是否为有效CSV文件的最佳方法是尝试解析它,并假设如果您无法解析,则它不是CSV!
答案 2 :(得分:3)
最简单的方法是尝试解析CSV并尝试从中读取值。使用str_getcsv
解析它,然后尝试从中读取值。如果您能够读取并验证至少几个值,则CSV有效。
修改强>
如果您无权访问str_getcsv
,请使用此权限,http://www.electrictoolbox.com/php-str-getcsv-function/来自str_getcsv
的替换代码:
if (!function_exists('str_getcsv')) {
function str_getcsv($input, $delimiter = ",", $enclosure = '"', $escape = "\\") {
$fp = fopen("php://memory", 'r+');
fputs($fp, $input);
rewind($fp);
$data = fgetcsv($fp, null, $delimiter, $enclosure); // $escape only got added in 5.3.0
fclose($fp);
return $data;
}
}
答案 3 :(得分:3)
从技术上讲,几乎所有文本文件都可以为CSV文件(除非引号不匹配等)。您可以尝试猜测它是否是二进制文件,但除非您的数据只有ASCII或类似的东西,否则没有可靠的方法。如果你关心的是人们没有错误地上传Excel文件,请检查文件扩展名。
答案 4 :(得分:0)
任何文本文件都是有效的CSV文件,因此无法提供验证其正确性的标准方法,因为它取决于您的真实期望。
在开始之前,您必须知道CSV文件中使用的分隔符。之后,最简单的验证方法是使用fgetcsv函数。例如:
<?php
$row = 1;
if (($handle = fopen("test.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) {
$num = count($data); // Number of fields in a row.
if ($num !== 5)
{
// OMG! Column count is not five!
}
else if (intval($data[$c]) == 0)
{
// OMG! Customer thinks we sold a car for $0!
}
}
fclose($handle);
}
?>