修改空白的PHP fgetcsv错误的任何变通方法?

dro*_*owe 6 php csv

给出以下CSV数据字符串(我无法确保引用字段)

AB,CD,   EF,GH,   IJ
Run Code Online (Sandbox Code Playgroud)

和PHP代码:

$arr = fgetcsv($f);
Run Code Online (Sandbox Code Playgroud)

(假设$ f是一个有效的文件指针,读取包含上述文本的文件) - 人们会期望这个结果:

Array('AB', 'CD', '   EF', 'GH', '   IJ');
Run Code Online (Sandbox Code Playgroud)

事实上,你得到:

Array('AB', 'CD', 'EF', 'GH', 'IJ');
Run Code Online (Sandbox Code Playgroud)

如果您需要该字段内的位置上下文,则会出现问题.

任何仍然能够利用fgetcsv,但确保空白不会丢失的变通方法

这里报告了这个bug:http://bugs.php.net/bug.php?id = 53848

mar*_*rio 6

Oooops.小号**吨.
我意外地写了一个不剥离空格的函数:

function str_getcsv2($line, $del=",", $q='"', $esc="\\") {
    $line = rtrim($line, "\r\n");
    preg_match_all("/\G ([^$q$del]*) $del | $q(( [$esc$esc][$q]|[^$q]* )+)$q $del /xms", "$line,", $r);
    foreach ($r[1] as $i=>$v) {  // merge both captures
        if (empty($v) && strlen($r[2][$i])) {
            $r[1][$i] = str_replace("$esc$q", "$q", $r[2][$i]);  // remove escape character
        }
    }
    return($r[1]);
}
Run Code Online (Sandbox Code Playgroud)

使用它像:

$arr = str_getcsv2(fgets($f));
Run Code Online (Sandbox Code Playgroud)