php - regular - Escapando para CSV
regex to preg_match (4)
Necesito almacenar una cadena en una base de datos MySQL. Los valores se utilizarán más adelante en un CSV. ¿Cómo puedo escapar de la cadena para que sea segura para CSV? Supongo que necesito escapar de lo siguiente: coma, comilla simple, comilla doble.
La función addslashes
de PHP hace:
comillas simples (''), comillas dobles ("), barra diagonal inversa () y NUL (el byte NULL).
Así que eso no funcionará. Sugerencias? Prefiero no intentar crear algún tipo de solución de expresiones regulares.
Además, necesito ser capaz de escapar.
Para aquellos de ustedes que intentan sanear los datos usando PHP y los resultados como un CSV, esto se puede hacer usando la función fputcsv () de PHP sin tener que escribir en un archivo como tal:
<?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;
fputcsv()
no siempre es necesario, especialmente si no necesita escribir ningún archivo, pero desea devolver el CSV como una respuesta HTTP. Todo lo que necesita hacer es poner dos valores entre comillas y evitar los caracteres de comillas dobles repitiendo una comilla doble cada vez que encuentre uno.
Aquí algunos ejemplos:
hello -> "hello"
this is my "quote" -> "this is my ""quote"""
catch ''em all -> "catch ''em all"
Como puede ver, el carácter de comilla simple no necesita escaparse.
Sigue un ejemplo de trabajo completo:
<?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);
Si obtienes un error es porque estás usando una versión antigua de PHP. Repárelo declarando las matrices con su sintaxis antigua y reemplazando la función lambda con una clásica.