转义为CSV

时间:2011-06-13 00:18:30

标签: php regex

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

PHP的addslashes函数执行:

  

单引号('),双引号(“),反斜杠()和NUL(NULL字节)。

这样就行不通了。建议?我宁愿不尝试创建某种正则表达式解决方案。

另外,我需要能够不受欢迎。

4 个答案:

答案 0 :(得分:36)

使用fputcsv()撰写,fgetcsv()阅读。

答案 1 :(得分:20)

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函数替换为经典函数来修复它。

答案 2 :(得分:14)

对于那些尝试使用PHP清理数据并输出为CSV的人来说,这可以使用PHP的fputcsv()函数来完成,而不必像这样写入文件:

<?php
// An example PHP array holding data to be put into CSV format
$data = [];
$data[] = ['row1_val1', 'row1_val2', 'row1_val3'];
$data[] = ['row2_val1', 'row2_val2', 'row2_val3'];

// Write to memory (unless buffer exceeds 2mb when it will write to /tmp)
$fp = fopen('php://temp', 'w+');
foreach ($data as $fields) {
    // Add row to CSV buffer
    fputcsv($fp, $fields);
}
rewind($fp); // Set the pointer back to the start
$csv_contents = stream_get_contents($fp); // Fetch the contents of our CSV
fclose($fp); // Close our pointer and free up memory and /tmp space

// Handle/Output your final sanitised CSV contents
echo $csv_contents;

答案 3 :(得分:12)

不要将转储的数据CSV存储在数据库中。使用fputcsv 导出为CSV时,将其转义为。如果您正在存储CSV转义,那么除了CSV导出之外,您实际上存储垃圾用于所有目的。