PHP fgetcsv解析含HTML实体的CSV时列数错误,求正确解析方法
解决PHP fgetcsv解析含URL编码逗号的CSV列数错误问题
问题原因
使用data://text/plain,加载CSV字符串时,PHP会自动解码URL编码字符(如%2C转为逗号),而fgetcsv会将解码后的逗号识别为列分隔符,导致字段被错误拆分,出现列数不匹配。
解决方案
方案1:Base64编码绕过自动解码
将CSV字符串转Base64后通过data://text/plain;base64,加载,避免PHP自动解码URL编码内容,fgetcsv仅按CSV规则拆分字段:
$encodedCsv = base64_encode($csvString); $file = fopen('data://text/plain;base64,' . $encodedCsv, 'r'); $fileOffers = []; while (($data = fgetcsv($file)) !== false) { // 按需解码字段中的URL内容 foreach ($data as &$field) { $field = urldecode($field); } $fileOffers[] = $data; } fclose($file);
方案2:临时替换URL编码逗号
解析前将%2C替换为占位符,完成解析后还原:
$tempCsv = str_replace('%2C', '__CSV_COMMA_HOLDER__', $csvString); $file = fopen('data://text/plain,' . $tempCsv, 'r'); $fileOffers = []; while (($data = fgetcsv($file)) !== false) { foreach ($data as &$field) { // 还原为原URL编码逗号,或直接解码为逗号 $field = str_replace('__CSV_COMMA_HOLDER__', '%2C', $field); // $field = urldecode($field); // 如需解码URL内容可启用 } $fileOffers[] = $data; } fclose($file);
方案3:规范CSV格式(推荐)
若能控制CSV生成逻辑,确保含特殊字符的字段用双引号包裹。fgetcsv会将引号内的内容视为单个字段,即使解码后出现逗号也不会拆分:
示例合法CSV行:
"https://typhur.sjv.io/c/77612/1936847/18771?kw=%22valentines%20day%20gifts%2C%20valentines%20day%20gift%20for%20men%22&prodsku=AF03-DTC",字段2,字段3
内容的提问来源于stack exchange,提问作者user497660
相关产品推荐
相关产品推荐

