Способы вставки перевода строки в PHP и их практическое применение

Раздел: Программирование на PHP -> Локализация и кодировки

Перевод строки в PHP: эффективные методы и особенности

Основное решение: константа PHP_EOL

Наиболее надёжный способ добавить перевод строки в PHP - использовать предопределённую константу PHP_EOL. Она автоматически выбирает правильный символ конца строки в зависимости от операционной системы: \n в Linux/macOS, \r\n в Windows. Это гарантирует переносимость кода.


    // Запись в файл с переносимыми концами строк
    $text = 'Строка 1' . PHP_EOL . 'Строка 2' . PHP_EOL . 'Строка 3';
    file_put_contents('file.txt', $text);
  

Php перевод строки (перевод строки в php)

Проблемы и ошибки:

Если при чтении файла используется другая ОС, концы строк могут отображаться как символы мусора (например, ^M в Unix при чтении Windows-файлов). Решение: использовать функцию file() с флагом FILE_IGNORE_NEW_LINES и обрабатывать строки самостоятельно, либо применять str_replace для унификации.

Как сделать перевод строки в heredoc/nowdoc?

Внутри heredoc и nowdoc переводы строк сохраняются как есть, включая табуляцию и пробелы. Для явного указания можно использовать экранирование только в heredoc (но не в nowdoc).


    $name = 'Мир';
    $text = <<<HEREDOC
    Привет, $name!
    Это вторая строка.
    HEREDOC;
  

Ошибка: если в heredoc попадёт закрывающий идентификатор без точки с запятой и переноса строки, будет синтаксическая ошибка. Всегда ставьте закрывающий идентификатор в начале строки без отступа.

Как вывести перевод строки в HTML?

Для отображения в браузере символ \n не создаёт новой строки. Необходимо использовать тег <br> или CSS white-space: pre-line. Функция nl2br() преобразует все символы новой строки в HTML-разрывы.


    $text = "Строка 1\nСтрока 2\nСтрока 3";
    echo nl2br($text);
  

Проблема: nl2br() по умолчанию не экранирует HTML-сущности. Для безопасного вывода комбинируйте с htmlspecialchars(): echo nl2br(htmlspecialchars($text));.

Как работать с переводами строк при отправке email?

В почтовых заголовках и теле письма перевод строки должен быть \r\n согласно RFC 2822. Использование только \n может привести к некорректной отправке. PHP-функция mail() ожидает, что строки разделены именно \r\n.


    $headers = "From: sender@example.com\r\n";
    $headers .= "Reply-To: reply@example.com\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $message = "Строка 1\r\nСтрока 2\r\nСтрока 3";
    mail('to@example.com', 'Тема', $message, $headers);
  

Типичная ошибка: использование PHP_EOL внутри email-заголовков, так как на Windows он даёт \r\n, а на Unix - \n, что для почты недопустимо. В email всегда используйте \r\n вручную.

Как использовать перевод строки в регулярных выражениях?

В регулярных выражениях символ \n - это литерал перевода строки. Для поиска любых символов, включая перенос, используется модификатор s. Для поиска конкретно начала или конца строки - ^ и $ (с модификатором m для многострочного режима).


    $text = "Первая строка\nВторая строка\nТретья строка";
    preg_match_all('/^.*$/m', $text, $matches);
    // $matches[0] содержит все три строки
  

Расширенные примеры работы с переводами строк

Пример 1: Запись в файл с учётом кодировки

Пример

  // Файл в кодировке UTF-8, перевод строки по ОС
  $data = "Файл с кириллицей" . PHP_EOL . "Вторая строка";
  file_put_contents('test.txt', $data);
  // Результат: test.txt с содержимым: "Файл с кириллицей\nВторая строка" (или \r\n на Windows)

Пример 2: Чтение файла и нормализация концов строк

Пример

  $content = file_get_contents('file_from_windows.txt');
  // Убираем \r, оставляем только \n
  $normalized = str_replace("\r\n", "\n", $content);
  $normalized = str_replace("\r", "\n", $normalized);
  echo $normalized;

Пример 3: Формирование CSV с переносами строк

Пример

  $rows = [
      ['Имя', 'Город'],
      ['Иван', 'Москва'],
      ['Анна', 'Санкт-Петербург']
  ];
  $csv = '';
  foreach ($rows as $row) {
      $csv .= implode(',', $row) . PHP_EOL;
  }
  file_put_contents('people.csv', $csv);
  // Файл people.csv будет содержать строки, разделённые в соответствии с ОС.

Пример 4: Обработка текста с разными кодировками и переводами строк

Пример

  $text_win1251 = "Привет\r\nМир\r\n";
  // Конвертируем в UTF-8 и нормализуем переводы
  $utf8 = mb_convert_encoding($text_win1251, 'UTF-8', 'Windows-1251');
  $normalized = str_replace(["\r\n", "\r"], "\n", $utf8);
  echo nl2br(htmlspecialchars($normalized));
  // Результат: "Привет<br />\nМир<br />\n" (браузер покажет две строки)

Пример 5: Генерация HTTP-заголовков с переводом строки

Пример

  header('Content-Type: text/plain; charset=utf-8');
  echo "Строка 1\r\nСтрока 2\r\nСтрока 3";

При выводе чистого текста в HTTP тело ответа, переводы строк в Windows с помощью \r\n могут вызвать ошибки в браузере. Лучше использовать только \n, так как HTTP-транспорт нормализует переводы.

Пример 6: Использование explode для разбиения по строкам

Пример

  $text = "строка1\nстрока2\nстрока3";
  $lines = explode("\n", $text);
  print_r($lines);
  Array
  (
      [0] => строка1
      [1] => строка2
      [2] => строка3
  )

Если текст может иметь смешанные концы строк (\r\n и \n), предварительно нормализуйте его с помощью preg_split('/\r\n?|\n/', $text).

Пример 7: Работа с heredoc и nowdoc в кодировках

Пример

  // heredoc поддерживает подстановку переменных и экранирование
  $var = "тест";
  $heredoc = <<<EOT
  Переменная: $var
  Строка с \n (это не перевод, а два символа: \)
  EOT;
  echo $heredoc;
  // Вывод:
  Переменная: тест
  Строка с \n (это не перевод, а два символа: \)

Перевод строки в PHP - comments

En
Php перевод строки (php)