转义 CSV
我需要在MySQL数据库中存储一个字符串。这些值稍后将在 CSV 中使用。如何对字符串进行转义,使其对 CSV 安全?我假设我需要转义以下内容:逗号,单引号,双引号。
PHP的功能可以:addslashes
单引号 (')、双引号 ()、反斜杠 () 和 NUL(空字节)。
所以这是行不通的。建议?我宁愿不尝试创建某种正则表达式解决方案。
另外,我需要能够解开。
我需要在MySQL数据库中存储一个字符串。这些值稍后将在 CSV 中使用。如何对字符串进行转义,使其对 CSV 安全?我假设我需要转义以下内容:逗号,单引号,双引号。
PHP的功能可以:addslashes
单引号 (')、双引号 ()、反斜杠 () 和 NUL(空字节)。
所以这是行不通的。建议?我宁愿不尝试创建某种正则表达式解决方案。
另外,我需要能够解开。
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 函数替换为经典语法来修复它。