You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 13:36:24