转义 CSV

2022-08-30 15:01:19

我需要在MySQL数据库中存储一个字符串。这些值稍后将在 CSV 中使用。如何对字符串进行转义,使其对 CSV 安全?我假设我需要转义以下内容:逗号,单引号,双引号。

PHP的功能可以:addslashes

单引号 (')、双引号 ()、反斜杠 () 和 NUL(空字节)。

所以这是行不通的。建议?我宁愿不尝试创建某种正则表达式解决方案。

另外,我需要能够解开。


答案 1

使用 fputcsv() 进行写入,并使用 fgetcsv() 进行读取。


答案 2

fputcsv()并不总是必要的,特别是如果您不需要写入任何文件,但您希望将CSV作为HTTP响应返回。您需要做的就是对每个值进行双引号,并在每次找到双引号时对重复双引号字符进行转义。

下面是一些示例:

hello -> "hello"
this is my "quote" -> "this is my ""quote"""
catch 'em all -> "catch 'em all"

如您所见,单引号字符不需要任何转义。

下面是一个完整的工作示例:

<?php

$arrayToCsvLine = function(array $values) {
    $line = '';

    $values = array_map(function ($v) {
        return '"' . str_replace('"', '""', $v) . '"';
    }, $values);

    $line .= implode(',', $values);

    return $line;
};

$csv = [];
$csv[] = $arrayToCsvLine(["hello", 'this is my "quote"', "catch 'em all"]);
$csv[] = $arrayToCsvLine(["hello", 'this is my "quote"', "catch 'em all"]);
$csv[] = $arrayToCsvLine(["hello", 'this is my "quote"', "catch 'em all"]);

$csv = implode("\r\n", $csv);

如果您遇到错误,只是因为您使用的是旧版本的PHP。通过使用旧语法声明数组并将 lambda 函数替换为经典语法来修复它。


推荐