From 745d8697ba6ff7b35bda24d9c2319a9ed848152c Mon Sep 17 00:00:00 2001 From: Aleksander Machniak Date: Mon, 7 Jan 2013 15:06:09 +0100 Subject: Fix quoted data handling in CSV files (#1488899) --- program/lib/Roundcube/rcube_csv2vcard.php | 37 +++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 7 deletions(-) (limited to 'program/lib/Roundcube/rcube_csv2vcard.php') diff --git a/program/lib/Roundcube/rcube_csv2vcard.php b/program/lib/Roundcube/rcube_csv2vcard.php index 9c28a3b49..f94a7aac7 100644 --- a/program/lib/Roundcube/rcube_csv2vcard.php +++ b/program/lib/Roundcube/rcube_csv2vcard.php @@ -271,13 +271,7 @@ class rcube_csv2vcard // Parse file foreach (preg_split("/[\r\n]+/", $csv) as $i => $line) { - $line = trim($line); - if (empty($line)) { - continue; - } - - $elements = rcube_utils::explode_quoted_string(',', $line); - + $elements = $this->parse_line($line); if (empty($elements)) { continue; } @@ -304,6 +298,35 @@ class rcube_csv2vcard return $this->vcards; } + /** + * Parse CSV file line + */ + protected function parse_line($line) + { + $line = trim($line); + if (empty($line)) { + return null; + } + + $fields = rcube_utils::explode_quoted_string(',', $line); + + // remove quotes if needed + if (!empty($fields)) { + foreach ($fields as $idx => $value) { + if (($len = strlen($value)) > 1 && $value[0] == '"' && $value[$len-1] == '"') { + // remove surrounding quotes + $value = substr($value, 1, -1); + // replace doubled quotes inside the string with single quote + $value = str_replace('""', '"', $value); + + $fields[$idx] = $value; + } + } + } + + return $fields; + } + /** * Parse CSV header line, detect fields mapping */ -- cgit v1.2.3