使用 str_getcsv() 解析带引号和逗号的 csv 字符串时,直接调用该函数即可自动处理标准 rfc 4180 格式。默认情况下,它会将逗号作为分隔符,双引号作为引用符,并正确识别被引用的字段内容。对于包含换行符的复杂多行 csv,需要配合 fgetcsv() 或手动预处理输入流。

如何解析单行含引号逗号的CSV
直接传入字符串给 str_getcsv() 即可返回数组。该函数会自动去除字段外层的引号,并将内部的双引号转义为单个双引号。如果字段中包含分隔符(如逗号),只要该字段被双引号包裹,解析器就会将其视为字段内容而非分隔符。

$csvString = 'name,age,city
"Smith, John",30,"New York, NY"
Doe, Jane,Chicago';
$lines = explode("\n", $csvString);
foreach ($lines as $line) {
if (trim($line) === '') continue;
$row = str_getcsv($line);
print_r($row);
}预期输出:
Array
(
[0] => name
[1] => age
[2] => city
)
Array
(
[0] => Smith, John
[1] => 30
[2] => New York, NY
)
Array
(
[0] => Doe
[1] => Jane
[2] => Chicago
)
立即学习“PHP免费学习笔记(深入)”;
如何处理非标准分隔符或自定义字符
当 CSV 文件使用分号、制表符或其他字符作为分隔符时,需要在调用 str_getcsv() 时显式指定 $separator 参数。同时,如果引用符不是双引号,或者转义符不同,也需要通过 $enclosure 和 $escape 参数进行调整。这确保了在数据源格式不统一时仍能准确解析。

$semicolonCsv = 'name;age;city "Smith, John";30;"New York, NY"'; $row = str_getcsv($semicolonCsv, ';', '"'); print_r($row);
预期输出:
Array
(
[0] => Smith, John
[1] => 30
[2] => New York, NY
)
当字段内包含未转义的双引号时会发生什么
如果 CSV 字符串中的字段内包含双引号,但未按 RFC 4180 标准进行转义(即两个双引号表示一个双引号),str_getcsv() 的行为取决于 PHP 版本和具体实现。在大多数现代 PHP 版本中,如果遇到未正确转义的引号,可能会导致解析截断或错误。例如,若字段内容为 "He said "hello"",解析器可能无法正确闭合引号,导致后续字段错位。因此,确保输入数据的规范性至关重要,或在解析前进行预处理清理。



















