Подтвердить что ты не робот

Когда я использую PHP_EOL вместо \n и наоборот? Проблема с клиентом Ajax/JQuery

У меня есть парсер php, который разбивает заданную строку на разрывы строк, делая что-то вроде этого:

$lines = explode(PHP_EOL,$content);

Парсер отлично работает при работе на стороне сервера. Однако, когда я передаю содержимое через пост с помощью ajax (используя метод jquery $.post), возникает проблема: разрывы строк не распознаются. Поэтому, после почти часа тестов и головокружения, я решил изменить PHP_EOL на "\n" , и он сработал:

$lines = explode ( "\n" , $content);

Теперь это работает! Черт возьми, я потерял столько времени! Может ли кто-нибудь объяснить мне, когда используете PHP_EOL и "\n" правильно, поэтому я могу сэкономить время в будущем? Цените свои добрые ответы;)

4b9b3361

Ответ 1

Постоянная PHP_EOL обычно должна использоваться для вывода на платформу.

  • В основном для вывода файлов действительно.
  • Фактически функции файлов уже преобразуют \n ← → \r\n в системах Windows, если они не используются в двоичном режиме fopen(…, "wb").

Для ввода файла вам следует выбрать \n. Хотя большинство сетевых протоколов (HTTP) предполагается использовать \r\n, это не гарантируется.

  • Поэтому лучше разбить на \n и удалить любой необязательный \r вручную:

    $lines = array_map("rtrim", explode("\n", $content));
    

    Или используйте функцию file(…, FILE_IGNORE_NEW_LINES), чтобы оставить обработку EOL на PHP или auto_detect_line_endings.

  • Более надежная альтернатива - это preg_split() и regexp:

    $lines = preg_split("/\R/", $content);
    

    \r placeholder обнаруживает любую комбинацию \r + \n. Так что было бы безопаснее и даже работать с текстовыми файлами Classic MacOS ≤ 9 (редко можно увидеть на практике).

    Обязательное примечание к микрооптимизации:
    В то время как регулярное выражение имеет стоимость, оно на удивление часто ускоряется, чем ручные циклы и строковая постобработка в PHP.

И есть несколько классических примеров, в которых вы должны избегать PHP_EOL из-за своей неопределенности :

  • Ручная генерация полезных нагрузок сетевого протокола, таких как HTTP через fsockopen().
  • Для mail() и MIME-конструкции (что в самом деле, вы не должны делать утомительно себя в любом случае).
  • Выход файла, , если, вы хотите последовательно писать только Unix \n новые строки независимо от среды.

Таким образом, используйте комбинацию слов "\r\n", когда вы не пишете файлы, но готовите данные для определенного контекста, ожидающего сетевых переходов.

Ответ 2

PHP_EOL следует использовать при записи вывода, например в файлы журнала.

Это приведет к разрыву строки, характерному для вашей платформы.

Ответ 3

PHP_EOL - это константа, содержащая символ разрыва строки, используемый серверной платформой. В случае Windows это \r\n. На * nix, это \n. У вас, видимо, есть сервер Windows.

Если вы были на сервере * nix, это изменение не исправило бы его, потому что это было бы \n. Если вы отправляете данные клиенту (т.е. Браузеру), вы должны использовать \r\n для обеспечения распознавания разрывов строк.

Ответ 4

PHP_EOL - это окончание строки, используемое сервером, на котором работает PHP. Представленный пользователем контент, вероятно, будет содержать строку в любом формате, который они используют. Однако вместо того, чтобы взламывать строки новой строки, просто используя функцию file(), она делает именно то, что вам нужно.

Ответ 5

Предпочтительно использовать IMHO с использованием PHP_EOL

чтобы обеспечить согласованность между обработкой PHP и JS разрыва строки, вы можете определить конечную строку в JS, используя PHP_EOL

var eol = '<?php echo str_replace(array("\n","\r"),array('\\n','\\r'),PHP_EOL) ?>';

используйте eol для разделения представленного содержимого textarea