Работа с символами переноса строки в PHP
Символы переноса строки в PHP
Основное решение: константа PHP_EOL
Для кроссплатформенной работы с переносами строки в PHP применяется предопределённая константа PHP_EOL. Она автоматически подставляет \n в Unix-подобных системах (Linux, macOS) и \r\n в Windows. Это избавляет от необходимости проверять ОС и делает код переносимым.
$line = "Первая строка" . PHP_EOL . "Вторая строка";
echo $line;
символы переноса строки php (символы переноса строки в php (\n, \r\n))
Результат на разных серверах будет отображать корректный перевод строки. PHP_EOL особенно полезен при записи в файлы (fwrite, file_put_contents) и отправке данных по сети, где требуется соблюдение стандарта хоста.
Как вставить перевод строки непосредственно в строку?
Прямое использование \n в двойных кавычках. В одинарных кавычках последовательность \n не интерпретируется и выводится буквально.
$str1 = "Строка1\nСтрока2";
$str2 = 'Строка1\nСтрока2';
echo $str1;
echo "\n";
echo $str2;
Строка1
Строка2
Строка1\nСтрока2
Типичная ошибка: путаница кавычек. Если строка заключена в одинарные кавычки, \n воспринимается как два символа - обратный слеш и буква n. Решение: использовать двойные кавычки или конкатенацию с chr(10).
Как получить перенос строки в стиле Windows (CRLF)?
Использование \r\n. Этот формат требуется при отправке электронных писем (заголовки и тело сообщения), а также при работе с файлами, предназначенными для Windows.
$text = "Заголовок\r\nПустая строка\r\nТекст";
file_put_contents('file.txt', $text);
На Linux символ \r (возврат каретки) может отображаться как управляющий символ, вызывая наложение строк при просмотре в консоли. При передаче файла на другую ОС может потребоваться преобразование.
Как оформить многострочный текст с сохранением переносов?
Синтаксис heredoc (с двойными кавычками) и nowdoc (с одинарными) позволяет вставлять переносы строк непосредственно в коде. Переменные внутри heredoc интерполируются.
$name = "Мир";
$heredoc = <<<EOT
Привет, $name!
Это вторая строка.
EOT;
echo $heredoc;
Привет, Мир!
Это вторая строка.
Закрывающий идентификатор (EOT) не должен содержать пробелов или табуляции перед ним. Иначе PHP выдаст синтаксическую ошибку. Также необходимо следить за отсутствием лишних пробелов после открывающего идентификатора.
Как преобразовать переносы строк в теги <br> для отображения в браузере?
Функция nl2br() заменяет все \n, \r\n и \r на <br /> (или <br> в зависимости от версии PHP). Это удобно для вывода многострочного текста из базы данных или файлов.
$text = "Первая строка\nВторая строка";
echo nl2br($text);
Первая строка<br />
Вторая строка
Если строка уже содержит HTML-тег <br>, функция может создать лишние разрывы. Поэтому перед nl2br() рекомендуется применять htmlspecialchars() для предотвращения XSS-атак, а затем уже преобразовывать переносы.
Как нормализовать переносы строк из разных источников?
С помощью str_replace() или preg_replace() можно привести \r\n (Windows) и \r (старые Mac) к единому \n (Unix). Важен порядок замены: сначала заменяем \r\n на \n, потом одиночные \r на \n.
$mixed = "Win\r\nLinux\nOld Mac\r";
$unix = str_replace(["\r\n", "\r"], "\n", $mixed);
echo $unix;
Win
Linux
Old Mac
Ошибка: если заменить \r на \n раньше, чем \r\n, то \r\n превратится в \n\n (двойной перевод). Нужно строго соблюдать порядок: сначала длинную последовательность, затем короткую.
Как правильно записывать строки в файл с учётом ОС?
Использовать константу PHP_EOL при формировании строки. Это гарантирует, что файл будет открыт в текстовом режиме с корректными окончаниями строк на любой платформе.
$handle = fopen("log.txt", "a");
fwrite($handle, "Событие1" . PHP_EOL);
fwrite($handle, "Событие2" . PHP_EOL);
fclose($handle);
Если файл впоследствии открывается в Windows-редакторе, а запись производилась на Linux, то Notepad не отобразит переносы (по умолчанию ожидает \r\n). В таких случаях следует принудительно использовать "\r\n".
Как найти строки, заканчивающиеся переносом, с помощью регулярных выражений?
Модификатор m (multiline) изменяет поведение якорей ^ и $, позволяя им совпадать с началом и концом каждой строки. Символ $ совпадает с позицией перед \n (если \n - последний символ, то также и после него).
$text = "строка1\nстрока2\n";
if (preg_match('/\n$/', $text)) {
echo "Завершается переводом строки";
}
Завершается переводом строки
Если текст в стиле Windows (\r\n), шаблон /\n$/ сработает только если \r не считается частью окончания. Рекомендуется нормализовать строку перед поиском или использовать /\r?\n$/.
Расширенные примеры
Пример 1. Использование heredoc для генерации HTML-разметки
Heredoc позволяет вставлять многострочный текст без экранирования кавычек. Переменные внутри интерполируются.
$title = "Документ";
$content = "Текст";
$html = <<<HTML
<!DOCTYPE html>
<html>
<head><title>$title</title></head>
<body>
<p>$content</p>
</body>
</html>
HTML;
echo $html;
<!DOCTYPE html> <html> <head><title>Документ</title></head> <body> <p>Текст</p> </body> </html>
Пример 2. Чтение файла с разными окончаниями строк и нормализация
Предположим, файл data.txt содержит строки с \r\n. Считываем его, приводим к \n, разбиваем на массив и выводим.
$content = file_get_contents('data.txt');
$content = str_replace("\r\n", "\n", $content);
$lines = explode("\n", $content);
foreach ($lines as $line) {
echo trim($line) . PHP_EOL;
}
Пример 3. Отправка email с корректными заголовками и телом
Для протокола SMTP требуется завершение строк \r\n как в заголовках, так и в теле письма. Несоблюдение может привести к сбою отправки.
$to = "user@example.com";
$subject = "Тест";
$message = "Строка 1\r\nСтрока 2\r\nСтрока 3";
$headers = "From: webmaster@example.com\r\nReply-To: webmaster@example.com\r\n";
if (mail($to, $subject, $message, $headers)) {
echo "Отправлено";
}
Пример 4. Использование strtr для замены множества символов
Функция strtr() выполняет замену по массиву пар. Это может быть эффективнее последовательных вызовов str_replace().
$text = "Windows\r\nLinux\nOldMac\r";
$replace_pairs = ["\r\n" => "\n", "\r" => "\n"];
$normalized = strtr($text, $replace_pairs);
echo $normalized;
Windows Linux OldMac
Пример 5. Обработка ввода из текстовой области (textarea) в HTML-форме
Значение из textarea может содержать переносы в стиле ОС клиента. Для безопасного вывода в браузере используется htmlspecialchars() и nl2br().
// $_POST['comment'] = "строка1\r\nстрока2"
$comment = $_POST['comment'];
echo nl2br(htmlspecialchars($comment));
Пример 6. Удаление лишних переносов (больше одного подряд)
Регулярное выражение заменяет два и более перевода строки на один.
$text = "Строка\n\n\nТретья строка";
$cleaned = preg_replace("/\n{2,}/", "\n", $text);
echo $cleaned;
Строка Третья строка
Пример 7. Явное указание концов строк при записи CSV
Функция fputcsv() автоматически добавляет PHP_EOL, но иногда требуется контроль за стилем переноса.
$data = [["Имя", "Возраст"], ["Анна", 25], ["Иван", 30]];
$handle = fopen("output.csv", "w");
foreach ($data as $row) {
fputcsv($handle, $row);
fwrite($handle, "\r\n"); // принудительно Windows-стиль
}
fclose($handle);
В данном примере после каждой строки дописывается \r\n. Это полезно, если файл будет открываться в Microsoft Excel.