0

嘿伙计们,我在 fread 上看到了很多选项(这需要一个文件,或写入内存),但我试图根据已经接受的字符串(未知格式)使输入无效。我有这样的东西

        if (FALSE !== str_getcsv($this->_contents, "\n"))
        {
            foreach (preg_split("/\n/", $this->_contents) AS $line)
            {
                $data[] = explode(',', $line);
            }

            print_r($data); die;
            $this->_format = 'csv';
            $this->_contents = $this->trimContents($data);

            return true;
        }

这适用于真正的 csv 或 csv 填充变量,但是当我尝试将其传递为垃圾以使其无效时,例如: https://www.gravatar.com/avatar/625a713bbbbdac8bea64bb8c2a9be0a4这是垃圾(因为它是一个 png),它无论如何都相信它的 csv 并继续前进,直到程序窒息。我怎样才能解决这个问题?我还没有看到至少没有几个类深的 CSV 验证器,是否有一个简单的三四行来(in)验证?

4

2 回答 2

1

如果您对可能进入系统的 CSV 类型有所了解,则可以应用一些启发式方法——冒着不接受有效 CSV 的风险。例如,您可以查看行长、行长的一致性、特殊字符等...

如果您所做的只是检查是否存在逗号和换行符,那么任何足够大的随机文件都可能包含这些,从而通过这样的 CSV 测试。

于 2013-11-01T22:51:17.050 回答
1

是否有一个简单的三或四行来(in)验证?

没有。CSV 的定义如此松散——它没有像标题字节这样的迹象,甚至没有用于分隔列的字符的标准!- 从技术上讲,没有办法判断文件是否为 CSV - 即使您的 PNG 在技术上也可能是一个巨大的单列 CSV,带有一些深奥的字段和行分隔符。

为了进行验证,请查看您使用 CSV 文件的目的以及您期望的输入。这些文件是否将包含地址数据,例如分成 10 列?然后查看文件的第一行,看看是否存在足够多的列,以及它们是否包含字母数字数据。您是否正在寻找一个充满数字的 CSV 文件?然后解析第一行,寻找你需要的值的种类。等等...

于 2013-11-01T22:52:31.747 回答