Когда я использую PHP_EOL вместо \ n и наоборот?Проблема с клиентом Ajax / Jquery - PullRequest
21 голосов
/ 12 февраля 2011

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

$lines = explode(PHP_EOL,$content);

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

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

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

Ответы [ 5 ]

41 голосов
/ 12 февраля 2011

Константа 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() и регулярное выражение:

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

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

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

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

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

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

9 голосов
/ 12 февраля 2011

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

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

5 голосов
/ 12 февраля 2011

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

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

2 голосов
/ 12 февраля 2011

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

0 голосов
/ 20 декабря 2011

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

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

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

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

...