it-swarm-ru.tech

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

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

$lines = explode(PHP_EOL,$content);

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

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

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

21
fabio

Константа PHP_EOL обычно должна использоваться для вывода для конкретной платформы.

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

Для file input ​​вы должны предпочесть \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 placeholder обнаруживает любую комбинацию \r + \n, Так будет безопаснее, и даже работать с текстовыми файлами Classic MacOS ≤ 9 (редко встречается на практике).

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

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

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

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

41
mario

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

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

9
alex

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

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

5
Jonah

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

2
mfonda