PHP读取CSV时如何正确替换字段内转义的单双引号
PHP读取CSV时替换单/双引号的正确实现
问题原因
之前的代码替换不生效,核心是两个认知偏差:
fgetcsv内置已经按照CSV标准规范完成了解析:CSV格式中用""双写双引号实现的转义,函数读取时会自动转换为单个原生双引号",不需要手动处理双写转义逻辑。- 代码里写的替换目标是HTML实体
",但fgetcsv返回的字符串里存储的是原生双引号字符,匹配目标错误自然不会有预期效果。
从你提供的样例可以验证解析逻辑是正常的:
CSV原始单元格内容:
"Select the product size and enter the quantity|15""x5000' Produce Film"
经过fgetcsv解析后$custom的实际值:15"x5000' Produce Film
这个解析结果完全符合CSV规范,不存在读取错误。
正确实现代码
只需要针对原生的单、双引号字符做替换即可,不需要额外处理CSV转义、HTML实体。为了避免不同环境PHP配置带来的解析差异,调用fgetcsv时可以显式传入字段包裹符和转义符参数,固定解析规则:
$resource = fopen($this->csv_file, 'r'); // 参数依次为:资源句柄、行长度限制、字段分隔符、字段包裹符、转义符 while (($data = fgetcsv($resource, 10000, ',', '"', '"')) !== false) { $custom = $data[10]; // 替换双引号为in,单引号为ft $custom = str_replace('"', 'in', $custom); $custom = str_replace("'", 'ft', $custom); // 后续业务处理逻辑 }
注意事项
- 不要手动替换
""形式的转义双引号:fgetcsv已经完成了这层解析,手动替换反而会导致内容错乱 - 如果运行后发现内容里仍然存在
",说明CSV源文件本身存储的就是HTML实体转义后的内容,不属于CSV标准的引号转义逻辑,这种情况再额外加一行$custom = str_replace('"', 'in', $custom);即可,从你提供的样例看不需要加这行 - 如果CSV是带BOM头的UTF-8编码,读取第一行时记得去除BOM头,避免首字段匹配异常
内容的提问来源于stack exchange,提问作者Akhilesh
相关产品推荐
相关产品推荐

