PHP HTML строка в CSV

#php #csv #line-breaks

#php #csv #разрывы строк

Вопрос:

Хожу по кругу, так что, надеюсь, кто-нибудь сможет меня поправить.

Генерация CSV с помощью PHP и использование моих данных из MySQL. Данные вводятся пользователем через TinyMCE, поэтому имеют различные теги «p» и т.д., Которые мне, очевидно, нужно удалить, что я могу успешно сделать, однако строка в csv по-прежнему отображается в разных ячейках даже после удаления.

Я пытался использовать strip_tags() и preg, соответствующие «/ n» и «/ r», и все виды для удаления разрывов строк, но безуспешно, поскольку он по-прежнему появляется в новых ячейках.

Я использую точку с запятой в качестве разделителя в csv.

Примером строки, из которой я пытаюсь удалить весь html, может быть <p>I would like to join because it looks fun</p><p>amp;nbsp;</p><p>Help me.</p> . Это происходит только тогда, когда их больше одного

тег или что-то в этом роде — если строка состоит всего из одной строки, она работает без проблем.

Вот CSV-код, который я использую:

     echo 'Username;Email;Date joined;Reason for joining'."rn";

    foreach($users as $user) {
        $csv_data .= $user->username . ';' . $user->email. ';' . date("d/m/y", $user->time_created) . ';' .  $user->reason_for_joining  .';'."rn";
    }

    echo $csv_data;
  

Где я ошибаюсь?

Спасибо, ребята 🙂

Ответ №1:

Формат CSV имеет больше подводных камней, чем можно было бы себе представить (с чем вы столкнулись). Поэтому не изобретайте велосипед и используйте fputcsv , который корректно экранирует все, что нуждается в экранировании.

fputcsv ожидается запись в файл, но вместо этого вы можете предоставить ему поддельный файл для записи, как описано здесь:

 $fp = fopen('php://output', 'w');

$delimiter = ';';
$headers = array('Username', 'Email', 'Date joined', 'Reason for joining');
fputcsv($fp, $headers, $delimiter);

foreach ($users as $user) {
    $fields = array($user->...);
    fputcsv($fp, $fields, $delimiter);
}

fclose($fp);
  

Комментарии:

1. Спасибо @deceze. Я создаю csv-файл с помощью php следующим образом: заголовок(«Content-Type: application/ csv»); заголовок(«Content-disposition: вложение; filename=users.csv»);. Могу ли я по-прежнему использовать fputcsv?

2. @пожалуйста, взгляните на мое обновление еще раз, я по глупости усложнил написание поддельного файла, чем это должно быть. Вы можете записывать непосредственно в выходной буфер, не проходя через временный файл.

3. Искал везде этот ответ. Я начал думать, что мне придется выводить в файл, а затем использовать file_get_contents для его отображения. Спасибо!

Ответ №2:

вы забыли «r» для первого echo, которое должно быть:


echo 'Имя пользователя; Электронная почта; Дата присоединения; Причина присоединения'."rn";

и лучше установите $csv_data пустым перед циклом ‘for’.

и если в ‘username’, ’email’, ‘reason_for_joining’ стоит точка с запятой, код сгенерирует неверно сформированный csv-файл.

Комментарии:

1. и лучше установите $csv_data пустым перед циклом ‘for’

2. и если в ‘username’, ’email’, ‘reason_for_joining’ стоит точка с запятой, код сгенерирует неверно сформированный csv-файл

3. Спасибо @nicola — я исправил свои ошибки. Все еще безуспешно, и я могу подтвердить, что точка с запятой не существует :).

4. как я знаю, в html, сгенерированном TinyMCE, всегда много «amp;nbsp;», вы можете увидеть это «amp;nbsp;» в примере причины присоединения в вашем вопросе. Это ‘amp;nbsp;’ содержит точку с запятой. Может быть, именно поэтому?

5. Я пытался удалить nbsp; но по-прежнему безуспешно. Однако предложение @deceze сработало! Спасибо @nicola