Необходимо сделать на странице сайта <textarea>, в которую можно было бы вставить скопированные из excel(через выделение + ctrl+c) данные и получить из этого в PHP данные в виде массива [строка1[ячейка1,ячейка2,..], строка2[ячейка1,..]] Столкнулся с проблемой: в некоторых excel ячейках встречаются символы переноса строки. В таких случаях excel ячейку обрамляет кавычками. Как мне определить где кончается строка 1 и начинается строка 2 в таком случае? Сами ячейки разделены между собой табуляцией, строки - символами \r\n, соответственно в обычном случае массив я создавал путем деления на строки через explode("\r\n"), а затем делением строки на ячейки через explode("\t"). А вот как быть когда внутри ячейки встречается те же \r\n... нужно как-то учитывать кавычки. Т.е. собственно вот пример строки которую я получаю в textarea(для наглядности вставил спецсиволы \t и \r\n, на самом деле они невидимы) ячейка1 \t ячейка2 \t "ячейка3 \r\n ячейка3 часть2" \r\n ячейка1 \t ячейка2 \t "ячейка3" \r\n Как мне спарсить первую строку? Возможно str_getcsv() поможет?
@supermike, пробуйте плагин Papa Parse. Попробовал на демо-странице - всё разбирает, как нужно. --- Добавлено --- P.S. Слегка заработался сегодня на фронтенде. Если вам нужно решение на PHP, то разбирайте данные, как CSV. Только разделитель - TAB
Спасибо за ссылку, решение на JS тоже пригодится. В общем, пришел к такому решению. Сам PHP с помощью fgetcsv() отлично парсит скопированное из excel, только ему нужно скармливать файл, поэтому решение такое - создаем временный файл, записываем в него данные и парсим как CSV Код (Text): <form method="post"> <textarea name="data"></textarea> <input type="submit"> </form> <pre> <?php if(!empty($_POST['data'])) { $temp = tmpfile(); fwrite($temp, $_POST['data']); fseek($temp, 0); while (($data = fgetcsv($temp, 1000, "\t")) !== FALSE) { print_r($data); } }
Ещё вариант. PHP: $text = "ячейка1 \t ячейка2 \t \"ячейка3 \r\n ячейка3 часть2\"\r\n". "ячейка1 \t ячейка2 \t \"ячейка3\" \r\n"; $file = new SplFileObject('data://text/plain,'.$text); while (!$file->eof()) { $data = $file->fgetcsv("\t"); print_r($data); }
@Emilien Интересное решение, спасибо! Никогда раньше не использовал ни SplFileObject ни конструкцию data://, много нового узнал. Получается в моем скрипте можно не создавать tmp файл, и вместо конструкции Код (Text): $temp = tmpfile(); fwrite($temp, $_POST['data']); fseek($temp, 0); написать просто Код (Text): $temp = fopen('data://text/plain,'.$_POST['data'], 'r');