str_getcsv() 不忽略引用的新行

Cha*_*one 6 php csv string parsing

我需要解析 CSV 字符串,第一步,我想从中获取行。我使用str_getcsv函数来执行此操作,但即使在最基本的情况下(用引号引起来的新行),它似乎也会失败。

$rows = '7;"Hi
";3';
$array = str_getcsv($rows,"\n",'"');
print_r($array);
Run Code Online (Sandbox Code Playgroud)

结果应该是只有一个值的数组,但我得到了两个 - 令人惊讶的是引用的新行在哪里......

result:
Array
(
    [0] => 7;"Hi
    [1] => ;3
)
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

编辑:很奇怪,但是当我尝试时

$rows = '7;"Hi
";3
8;Hello;6';
Run Code Online (Sandbox Code Playgroud)

结果是

Array
(
    [0] => 7;"Hi
    [1] => ;3
8;Hello;6
)
Run Code Online (Sandbox Code Playgroud)

Cha*_*one 1

似乎str_getcsv()不允许在字符串字段中包含换行符,并通过换行符解析行而不检查新行是否在字段中。有必要使用与此功能不同的东西,它只是不能很好地工作。

我找到了直接解析 CSV 的代码,无需将其解析为user 函数手册中的行。所缺少的是它不使用第一行中的值作为其他行的键。str_getcsv()normadize -a- gmail -d- com

function parse_csv ($csv_string, $delimiter = ",", $skip_empty_lines = true, $trim_fields = true)
{
    $enc = preg_replace('/(?<!")""/', '!!Q!!', $csv_string);
    $enc = preg_replace_callback(
        '/"(.*?)"/s',
        function ($field) {
            return urlencode(utf8_encode($field[1]));
        },
        $enc
    );
    $lines = preg_split($skip_empty_lines ? ($trim_fields ? '/( *\R)+/s' : '/\R+/s') : '/\R/s', $enc);
    return array_map(
        function ($line) use ($delimiter, $trim_fields) {
            $fields = $trim_fields ? array_map('trim', explode($delimiter, $line)) : explode($delimiter, $line);
            return array_map(
                function ($field) {
                    return str_replace('!!Q!!', '"', utf8_decode(urldecode($field)));
                },
                $fields
            );
        },
        $lines
    );
}

?>
Run Code Online (Sandbox Code Playgroud)