如何使PHP正确转义CSV(fgetcsv)?

时间:2018-04-10 09:55:26

标签: php csv escaping fgetcsv

看起来PHP在fgetcsv或str_getcsv中存在双引号和转义问题。

这是命令行中的一个简单示例:

$ echo '"\"test\""' | php -r '$t=file_get_contents("php://stdin"); print "input: ".$t."\noutput: ".str_getcsv($t)[0];'

结果:

input: "\"test\""
output: \"test\"

预期结果:

input: "\"test\""
output: "test"

我希望输出不同,因为外部引号括起引号,内部引号被转义。不应将转义字符传送到输出。

为什么PHP解释这个不同以及什么是强大的解决方法?

1 个答案:

答案 0 :(得分:0)

我用str_replace解决了这个问题。

str_replace("\\\"", '"', $string);

这是我用来修复已解析的CSV行的整个数组的功能。

function fixCSVescapes(&$data) {
    for ($i = 0; $i < count($data); $i++) {
        $row = $data[$i];
        $name = $row["name"];
        $fixName = str_replace("\\\"", '"', $name);
        $data[$i]["name"] = $fixName;
    }
}

请注意,这是一个取决于特定输入的功能。在这种情况下,\"可能只出现一列,因此它仅对该特定列进行替换。希望这对某人有用。