validate regular preg_match_all preg_match matches ejemplos php regex

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.


No almacene los datos CSV escapados en la base de datos. fputcsv cuando exporte a CSV usando fputcsv . Si está almacenando el CSV escapado, básicamente está almacenando basura para todos los fines distintos de la exportación de CSV.


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.